diff --git a/CHANGELOG.en.md b/CHANGELOG.en.md index debb7487..5a7cf331 100644 --- a/CHANGELOG.en.md +++ b/CHANGELOG.en.md @@ -2,576 +2,903 @@ [Français](CHANGELOG.md) -Desktop, Android (APK) and Tundra/Sargo. Status indicates development sources, a built APK or a published release. Source changes require an update to the installed package. +Updates by date and platform. Within each group: Add, Change, Fix, Note, Test. Entries describe the state at their date; a fix in development requires an updated installed version. + + + +## 14/10/2026 : 2.7-preview.21 + +![APK published](https://img.shields.io/badge/APK%20published-2F855A?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Appearance](https://img.shields.io/badge/Appearance-475569?style=flat-square) : Unavailable-feature messages are easier to read in light and dark themes. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Call history](https://img.shields.io/badge/Call%20history-475569?style=flat-square) : Contact names now appear when the call history first loads. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Keyboard](https://img.shields.io/badge/Keyboard-475569?style=flat-square) : Additional dictionaries available offline; improved Gaia keyboard activation and recovery. Verification on affected devices is still needed. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Storage panels restored. A loading error no longer locks the other menus. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-2F855A?style=flat-square) ![Android data](https://img.shields.io/badge/Android%20data-475569?style=flat-square) : Read Android contacts, SMS and call history in Gaia after granting access. Existing local Vulpes data is preserved. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Return to Vulpes without a persistent white overlay; a closed catalogue can be reopened. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Keyboard](https://img.shields.io/badge/Keyboard-475569?style=flat-square) : The reported blank keyboard still needs reproduction on the affected devices. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Android data](https://img.shields.io/badge/Android%20data-475569?style=flat-square) : First, read-only integration, excluding MMS. Sending and editing Android records use Android apps; new Gaia contacts stay local. SMS and call log access depend on ROM and installer permissions. Tested on Android 9; other versions need verification. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Shared Gaia fixes are included in full installation images and boot updates. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : New installation image built; Pixel boot and flashing must be tested before publication. -## 2.7-preview.20 — APK built · 13 October 2026 +## 13/10/2026 : 2.7-preview.20 -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview 20 brings together shared fixes since APK Preview 17: Gaia settings, appearance, selectors, keyboard, contacts, Marketplace and media. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Camera: WebM recording with posters and Gallery/Video playback. Microphone permission requested; controls follow hardware capabilities. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera: more reliable sensor switching, stopping and resuming. Desktop and Android use their camera APIs; Sargo retains its HAL adapter. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: Wi-Fi, Bluetooth, calls, SMS/MMS and network settings updates included in the sources. Unimplemented functions remain identified in their panels. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Changelog: simplified French/English text and badges retained; desktop/APK/Sargo filters independent of headings. Markdown, website and release notes generated from one JSON. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) APK signed with the previous Preview key; alignment and consistency of 53 shared files verified. Android runtime validation in progress. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Desktop/Sargo Gecko 156.0.1; Android GeckoView 156.0. Gaia 2.7.0. The APK delegates calls/SMS to Android; it does not replace Android telephony. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Experimental Preview: Mozilla account/Sync, remote location, Firefox OS add-ons and USB file transfer remain incomplete. Sargo: preview around 16 fps; recorded sound and call audio require separate qualification. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Pixel 3a: Preview 20 r62 RAM-booted, then flashed to boot_a. Matching readback hash; installed startup, eleven Gaia checks and ten native checks passed. Data retained, Wi-Fi connected and LTE registration observed. No new two-way audio call tested. +![Published](https://img.shields.io/badge/Published-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Video mode, with thumbnails and playback in Gallery and Video. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Improvements to settings, appearance, pickers, keyboard, contacts and media. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : More reliable camera switching, shutdown and resume. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Services](https://img.shields.io/badge/Services-475569?style=flat-square) : Mozilla Account, Sync, remote location, extensions and USB transfer remain incomplete. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Release](https://img.shields.io/badge/Release-475569?style=flat-square) : Preview 20 APK available. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Compatibility](https://img.shields.io/badge/Compatibility-475569?style=flat-square) : Calls and SMS use Android. This Preview has not yet been validated in use on Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Preview runs at around 16 frames per second. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Updates to Wi-Fi, Bluetooth, calls, SMS/MMS and network settings. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Audio](https://img.shields.io/badge/Audio-475569?style=flat-square) : Video sound and two-way call audio still need separate testing. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Preview 20 installed on Pixel 3a with data preserved. Wi-Fi connected and 4G registration observed. + +### ![Web](https://img.shields.io/badge/Web-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Changelog](https://img.shields.io/badge/Changelog-475569?style=flat-square) : Simpler French and English history, with badges and platform filters. Shared content for the website and releases. + +[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.20) -## In development — 12 October 2026 — Video and clock settings +## 12/10/2026 : Video and time -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Camera: WebM VP8/Opus recording with microphone permission, poster and storage. Buffer limited to 32 MiB; recording stops before releasing the sensor. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera, Gallery and Video: handle WebM files and their posters. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Settings: original Gaia date/time pickers, Back from built-in keyboard settings and unclipped select labels. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Improve Vulpes: link to project issues. Unavailable services explained in their panels. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: simulated 1920 × 1080 video decoded; photo, gallery, camera resume and navigation checked. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo r61 in RAM: 480 × 640 video decoded, eight front/rear switches passed. Test media deleted; recorded audio not listened to. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: preview measured around 16 fps versus 12 in the previous test. 30 fps is not reached yet. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: automatic NITZ time, persistent setting and guarded manual writes. Sync depends on carrier time; no NTP fallback, timezone selected manually. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Android: assets staged and Java compiled, without a new APK or Android video test at this stage. Mozilla account/Sync, remote location, Firefox OS add-ons and USB file transfer remain unimplemented. No flashing or publication. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Video recording with sound, thumbnails and playback in Gallery and Video. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Help](https://img.shields.io/badge/Help-475569?style=flat-square) : “Improve Vulpes” opens the project’s issues. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Date and time pickers restored; Keyboard back navigation and list text fixed. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Recording checked with a simulated camera. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Changes prepared for a future APK; video not yet tested on Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Improved preview, at around 16 frames per second. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Clock](https://img.shields.io/badge/Clock-475569?style=flat-square) : Automatic time depends on network information; time zone remains manual. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Video recording and camera switching checked. Video sound still needs listening tests. -## In development — 12 October 2026 — Calls and Wi-Fi sharing +## 12/10/2026 : Calls and hotspot -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Gaia dialogs: close after opening, complete interrupted transitions and allow retry after rejected validation. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: longer carrier-service timeout; slow settings separated from voice/SMS commands. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: call waiting, caller ID and four forwarding rules connected to oFono, with validation and readback. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: WPA2 or open Wi-Fi hotspot, NetworkManager configuration and compatible firewall. Private password, accessible only to Settings. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) r59 in RAM: 69 panels, dialogs and APNs checked on desktop/Pixel. Hotspot saved, started and stopped through Gaia; previous Wi-Fi restored. 44 Python tests and dialog regressions passed. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Internet forwarding to another device untested. Voicemail, call barring, PIN/PUK, Wi-Fi certificates and USB tethering remain open. Android assets synchronized; no new APK, flashing or publication. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Dialog closing and retry after an error fixed. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Calls](https://img.shields.io/badge/Calls-475569?style=flat-square) : Settings for call waiting, caller ID and call forwarding. +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Hotspot with or without a password. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Slow settings no longer block calls and SMS. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Hotspot activation checked; Internet access from another device still needs testing. -## In development — 12 October 2026 — Network settings +## 12/10/2026 : Network settings -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wi-Fi: actual IPv4 address and link speed; no “undefined” label when a measurement is missing. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: GSM/UMTS/LTE selection and editing of existing Internet/MMS APNs, with validation and readback. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) APNs: reject changes to active profiles, protect IMS and passwords, attempt rollback after failure and report its result. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: bounded queue for slow settings. Call status read in 20 ms during a five-second settings wait. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 38 Python tests, 69 desktop panels and APN/network workflows on RAM-booted Pixel checked. Android assets synchronized. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) APN creation, deletion and reset unavailable. Manual carrier selection and certificates still open. No new APK, flashing or publication. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : IP address and connection speed displayed correctly. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Network type selection and mobile access point editing. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : More reliable network settings when the modem responds slowly. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Adding, deleting and resetting access points remain incomplete. -## In development — 12 October 2026 — Settings audit +## 12/10/2026 : Settings review -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Settings: recover navigation after a controller or dialog fails; consistent module generation. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Accessibility filters and Vulpes support. Original panels retained with explanations for unavailable features. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Desktop: profile statistics and Gecko downloads. Android: private storage statistics. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: mobile data, roaming, clock and hidden Wi-Fi connected. Legacy network errors in Sound settings fixed. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 97 views inventoried; 69 desktop/Pixel panels opened and seven native dialogs checked. Storage, data and timezone read back after writes on r51 in RAM. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Contextual views and unavailable services are not all qualified. Android Java compiled, without a new APK. No flashing, ticket closure or publication. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Navigation, accessibility and help fixed. Incomplete panels remain visible. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Testing](https://img.shields.io/badge/Testing-475569?style=flat-square) : Menus reviewed; some actions still depend on hardware or the carrier. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Storage](https://img.shields.io/badge/Storage-475569?style=flat-square) : Storage information and downloads connected. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Storage](https://img.shields.io/badge/Storage-475569?style=flat-square) : Display of storage used by Vulpes. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Mobile data, roaming, time, hidden Wi-Fi networks and Sound panel fixed. -## In development — 12 October 2026 — Settings navigation +## 12/10/2026 : Settings navigation -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Dropdowns: Gaia selector with confirm/cancel; Light/Dark choice accessible. SIM manager adapted to one slot. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Unavailable panels: explanations and disabled controls instead of unresponsive links. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: saved Wi-Fi networks separated from slow scans; cache preserved during status reads. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: SIM information, SMS centre and delivery reports connected to the modem. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) r45 in RAM: eight appearance checks, five panels and actual SMS report setting changes passed, then setting restored. Desktop selector checked; APK assets staged. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Enterprise certificates and other carrier options still unavailable. No SMS sent, new APK, flashing or publication. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Appearance](https://img.shields.io/badge/Appearance-475569?style=flat-square) : Light/Dark selection and picker confirmation or cancellation restored. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SIM](https://img.shields.io/badge/SIM-475569?style=flat-square) : Manager adapted to single-SIM phones. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : SIM information, message centre and delivery reports. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Faster loading of saved networks. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Wi-Fi certificates, SIM security and USB storage remain incomplete. -## In development — 12 October 2026 — Shared fixes on Pixel 3a +## 12/10/2026 : Appearance on Pixel 3a -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: r39 RAM boot with shared fixes and initial dark mode. r35 kernel and hardware configuration preserved. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Boot, viewport size, persistent settings, battery, call UI and Fira checked. Modem, audio, Wi-Fi and Bluetooth services active. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Seven Gaia appearance checks passed: propagated theme, readable headers, aligned labels and return to light mode. Pixel screenshot inspected. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Tool to update Gaia in a private boot image, with hashes, retained sources and checks for unchanged hardware components. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) No new call, SMS or pairing tested. Full theme and Android behavior still need qualification. No new APK, flashing or publication. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Appearance](https://img.shields.io/badge/Appearance-475569?style=flat-square) : Shared light and dark modes available on Pixel 3a. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Settings fixes and Firefox OS fonts included. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Testing](https://img.shields.io/badge/Testing-475569?style=flat-square) : No new call, SMS or Bluetooth test at this stage. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Appearance](https://img.shields.io/badge/Appearance-475569?style=flat-square) : Themes and display checked on the phone. -## In development — 11 October 2026 — Appearance and shared keyboard +## 11/10/2026 : Appearance and keyboard -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Appearance: Light, Dark or Follow system, shared between apps and retained across restarts. Wallpapers, photos and external websites preserved. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Keyboard: shared editing operations, selection and deletion, protection against late replies. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: nine appearance checks and Messages input gestures passed, without sending SMS. Visual review of Settings, Messages, Phone and Contacts. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Android: experimental Gaia keyboard option; Android keyboard remains the default, input mode restored on close. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android: briefly retry the same busy sensor, without retrying after permission denial or closing Camera. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Preview 19 built locally: signature, alignment, parity and bridge/camera tests passed. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Gaia keyboard, Android front camera and full theme still need qualification. Sources ready for Sargo, which remained on r35 at this stage. No upload, flashing or ticket closure. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Appearance](https://img.shields.io/badge/Appearance-475569?style=flat-square) : Light, Dark and System modes, preserved after restart. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Keyboard](https://img.shields.io/badge/Keyboard-475569?style=flat-square) : Text selection and deletion fixed. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Themes and SMS typing checked. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Keyboard](https://img.shields.io/badge/Keyboard-475569?style=flat-square) : Experimental Gaia keyboard; Android keyboard remains the default. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Retry available when the camera is busy. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Testing](https://img.shields.io/badge/Testing-475569?style=flat-square) : Preview 19 built; themes, keyboard and front camera still need testing on Android. -## In development — 11 October 2026 — Settings and homescreens +## 11/10/2026 : Settings and home screen -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Settings: ringtone management, PIN entry/deletion, lock disabling and third-party app permission list. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Home: first initialization of the second launcher and wallpaper previews. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Languages: refresh Vulpes labels after language changes; English fallback outside French. Dismiss camera failure panels and installation banners. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Android: open the Gaia tray by tapping the status bar. Preview 18 built, signed and compared with sources. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: nine Gaia workflows, five banner checks and twelve activity/camera tests passed. Sargo r35 Bluetooth confirmed by the user. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Compositor hot restart still unstable: files restored and return to r35. Fixes not yet qualified on Sargo at this stage; Android keyboard/theme open. No APK publication or flashing. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Home](https://img.shields.io/badge/Home-475569?style=flat-square) : Second home screen, wallpaper previews and installation banner fixed. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Error message dismissal restored. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Ringtones, lock code, permissions and French/English labels fixed. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Open the notification tray by tapping the status bar. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Preview 18 built locally. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : Returned to the previous version after an unstable interface restart. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Operation confirmed by the user. -## In development — 9 October 2026 — MMS and Bluetooth +## 09/10/2026 : MMS and Bluetooth -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Bluetooth: shared Gaia adapter, separate hardware commands and access restricted to authorized apps. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: power, discovery, explicit pairing, connection and removal from Gaia Bluetooth settings. Bluetooth audio modules included. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: Qualcomm network services and MMS transport connected. D-Bus disconnect no longer terminates the MMS daemon. Persistent state, retry without duplicates or uncertain automatic resends. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) r35 in RAM: image MMS visible and accepted by Orange MMSC; recipient delivery still unconfirmed. Five Bluetooth devices discovered, A2DP to desktop verified. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 191 Tundra Python tests and 18 JavaScript tests passed. Smaller ramdisk and synchronized Android assets. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Headset call audio unqualified. No new APK, flashing or push at this stage. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Gaia panels connected to each platform’s capabilities. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Discovery, pairing, connection, forgetting devices and audio output. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Sending preserved and resumed after interruption. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Testing](https://img.shields.io/badge/Testing-475569?style=flat-square) : MMS accepted by the carrier, delivery not confirmed. Headset call audio still needs testing. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Bluetooth audio playback to a PC checked. -## In development — 8 October 2026 — Camera and MMS transport +## 08/10/2026 : Camera and MMS -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera: stop the stream before detaching video; await sensor closure, reset the viewfinder and recalculate size after rotation. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) MMS: preserve Blob attachments and keep messages pending until transport confirmation. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: reused WebGL viewfinder without intermediate video capture; screen stays awake during preview. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop and Sargo: Camera/Gallery workflows and eight native switches checked. JPEG, focus and zoom working; rear ~16 fps, front ~25–27 fps in this test. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: persistent MMS queue, Nuntium codec and oFono transport. Text/photo UI tested with simulated transport. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Mobile data blocked carrier MMS at this stage. Android assets synchronized; no new APK, flashing or push. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Camera switching, shutdown and display after rotation fixed. + +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Attachments preserved and sending shown as pending until confirmation. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Preview measured at around 16 fps on the rear camera and 25–27 on the front. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Real sending still blocked by the mobile data connection. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Focus, zoom and photo capture checked. -## 8 October 2026 — Call-log redial and error dialogs +## 08/10/2026 : Call history and dialogs -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Gaia dialogs: visible text instead of a grey screen with a lone button. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Call log: redial through the same service as the keypad, without legacy Gecko APIs. Shared desktop/Android/Sargo file. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) MMS: clearly report unavailable sending, retain text and attachments, no false airplane-mode message. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: FR/EN dialogs and preserved composer. RAM-booted Sargo: 11 Gaia checks passed, redial tested with a simulated modem. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) No real call or audio validation at this stage. Android assets synchronized, no new APK published. +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Readable error messages with usable buttons. + +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Clear message when sending is unavailable, without losing the draft. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Phone](https://img.shields.io/badge/Phone-475569?style=flat-square) : Calling back from call history restored. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Calls](https://img.shields.io/badge/Calls-475569?style=flat-square) : Flow checked with simulated calls; real audio not tested. -## In development — 8 October 2026 — SMS and audio +## 08/10/2026 : SMS and audio -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS: send in one tap while keeping the keyboard. Paperclip connected to the Gaia image, audio, video or contact menu. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) UI: visible volume indicator, lockscreen gestures and notification swiping fixed. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: keyboard, attachments, Gallery, call UI and volume checked; notification swiped without moving the page. No new APK published. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: PulseAudio access, Qualcomm relay, D-Bus protocol and calibration devices restored. Conflicting Android audio service removed. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: 11 Gaia checks, calibration and rear/front/rear previews passed. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Calls failed before ringing with a network error in this test. Two-way audio, Pixel gesture and MMS still unverified. No flashing or publication. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Volume display, lock screen and notification swiping fixed. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Send with one tap without first closing the keyboard. Attachment menu restored. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Audio](https://img.shields.io/badge/Audio-475569?style=flat-square) : Call audio routing fixes. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Calls](https://img.shields.io/badge/Calls-475569?style=flat-square) : Network issues prevented testing a real conversation; two-way audio not confirmed. -## In development — 8 October 2026 — Telephony reliability +## 08/10/2026 : Network reliability -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: radio service survives client closure. No automatic new call or SMS after a lost response. Errors exclude phone numbers and message text. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Network/audio diagnostics without personal identifiers, and pinned carrier settings in the native image. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS: wait for the actual Gaia manager and accept uppercase oFono IDs. Conversation checks restored without resending. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: LTE restored after reboot, SMS confirmed sent by the modem, non-silent microphone and audio playback accepted. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Recipient delivery, two-way call audio and modem stability remain unqualified. Compositor hot restart unstable. No new APK, flashing or push. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Messages linked to the correct conversation. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Improved modem recovery; retries avoid duplicate calls and SMS. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Calls](https://img.shields.io/badge/Calls-475569?style=flat-square) : Network stability and two-way audio still need confirmation. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Return to the 4G network after modem restart checked. -## 8 October 2026 — Public source update +## 08/10/2026 : Public source code -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Published Camera, Contacts, SMS and Marketplace fixes, plus Sargo build and recovery tools. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Updated French and English READMEs with verified features and limitations. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Create the report directory when checking Android asset parity in a fresh checkout. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Checked native Wi-Fi configuration: no bundled connection profiles. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Internal documents, personal data and keys excluded from the repository. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Public APK unchanged (Preview17); October 8 fixes not included. No new native image published. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo: modem still searching for a network; call audio, Bluetooth pairing and profiles await validation. +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Source code](https://img.shields.io/badge/Source%20code-475569?style=flat-square) : Camera, contacts, SMS and Marketplace fixes published, with updated French/English project overviews. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Build](https://img.shields.io/badge/Build-475569?style=flat-square) : Building from a fresh repository copy fixed. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : The public APK remains Preview 17; these fixes are in the source code. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Network search still unstable at this stage; no new image published. -## 8 October 2026 — Camera and Contacts workflows · in development +## 08/10/2026 : Camera and contacts -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera: corrected sequential opening, sensor cleanup and front/rear identification. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Contacts: corrected photo and date transport on desktop, Android and Tundra. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Contacts: restored refresh after editing, SMS handoff, number picking and dialer prefilling. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Gallery: open the contact photo picker even when the app is already running. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: include corrected Contacts files in the boot image. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android: pass recipients and text to the SMS app, including replies and unconfirmed typed numbers. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Tests for camera lifecycle, contact storage, permissions, binary transport and activities. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: verified JPEG capture, Gallery, contact photos, creation, editing, search, favourites and deletion. No calls or SMS sent. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo in RAM: verified autofocus, zoom, four camera switches, capture and Gallery; tested Contacts with touch input. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: checked stored conversations, keyboard and notifications; detected four Wi-Fi networks. New SMS and call audio await validation. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: BlueZ and dependencies pinned by SHA256. Power-on and discovery tested; pairing and profiles await validation. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: native certificate store. Tested HTTPS, corrupted archives, file collisions and repeated builds. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Published Preview17 with download and SHA256 checks. These fixes remain in source; Android SMS needs a real-device test. No Sargo flash. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : More reliable opening and camera switching. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Contacts](https://img.shields.io/badge/Contacts-475569?style=flat-square) : Photos, dates, edits and number selection from Messages or Phone fixed. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Gallery](https://img.shields.io/badge/Gallery-475569?style=flat-square) : Media selection fixed. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Fixes in source code; public APK unchanged at this stage. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Number and text passed correctly to the Android app. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Discovery available; pairing and audio use still need testing. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Photo capture, focus, zoom and camera switching checked. -## 6 October 2026 — Embedded Marketplace theme · in development +## 06/10/2026 : Marketplace theme -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Marketplace: embedded theme with local Fira fonts, compact navigation, touch controls, collapsible filters and scrolling screenshots. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Preserve `mode=app` across navigation, search, filters and language changes. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Hide website headers in embedded mode. Gaia handles confirmations; the catalogue receives no extra privileges. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Checked 16 French/English pages, 2 standard pages and mobile layouts at 320 and 360 pixels. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Theme ready locally, not deployed. Desktop and Sargo launchers updated; Android integration pending the next APK. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Integration planned for a future APK. + +### ![Web](https://img.shields.io/badge/Web-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Embedded theme: Fira font, compact navigation, touch buttons and scrollable screenshots. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Embedded display preserved during search, filtering and language changes. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Theme prepared locally, not yet deployed to the website. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Display](https://img.shields.io/badge/Display-475569?style=flat-square) : French and English pages checked on small screens. -## 6 October 2026 — Gaia banners · in development +## 06/10/2026 : Notification banners -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Automatically dismiss the “Application installed” banner even without an animation-end event. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Cancel old timers when a new banner replaces the previous one. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: checked display, expiry, replacement and click dismissal. Sargo: verified dismissal after five seconds in RAM. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Fix available in shared sources for the next APK. No flash or release. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : The “Application installed” banner disappears automatically and is replaced correctly. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Banner display and dismissal checked. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Fix prepared for the next APK. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Banner disappearance after five seconds checked. -## 6 October 2026 — Wi-Fi and Settings panels · in development +## 06/10/2026 : Wi-Fi and settings -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Settings: open panels even without an animation-end event, without duplicate initialization. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: corrected Wi-Fi events to restore network results and report disconnection properly. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: detected four access points grouped into two networks. Connection confirmed and HTTPS request passed with certificate verification. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Shared sources, desktop server and Sargo RAM trial updated. Fixes not included in the public APK. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Panels open even when an animation does not finish normally. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Fixes not yet included in the public APK. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Detected networks and disconnections displayed correctly. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Search, connection and Internet access checked. -## 6 October 2026 — Marketplace · in development +## 06/10/2026 : Marketplace navigation -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Desktop/Sargo: keep Marketplace below the status bar, hide it on Home and remove it when closed. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Cancelled navigation or an old error page no longer hides a retry. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Local error message with a Retry button when the catalogue is unavailable. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: verified navigation, network errors, retry, Home and closing. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo in RAM: seven checks passed with a local page and forced unlock. Remote catalogue not validated without Internet access. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Rebuilt local Preview17 APK; checked signature, alignment and assets. No new Android device test or release. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Local message with a Retry button when the catalogue is unavailable. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : The catalogue stays below the status bar and hides when returning home or closing it. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Navigation](https://img.shields.io/badge/Navigation-475569?style=flat-square) : An earlier error no longer hides a new attempt. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Navigation, errors, returning home and closing checked. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Preview 17 rebuilt locally, without a new Android test. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Interface tested with a local page; remote catalogue not checked without Internet. -## 2.7-preview.17 — APK built · 5 October 2026 +## 05/10/2026 : 2.7-preview.17 -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Marketplace on Home with its original icon and the Vulpes catalogue in French or English. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Confirmed ZIP app installation, launch from Home and removal. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Installed apps isolated from Gaia sources and system privileges. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: full 2048 workflow plus archive, path, limit, cancellation and single-use confirmation checks. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview17 APK built and signed with Marketplace, GeckoView and private package storage. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Android 16/API 36 emulator: 2048 installation, launch, isolation, persistence after app restart and removal. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo in RAM on October 6: Home and Marketplace assets verified, 9 of 10 system checks passed. Viewport changes on unlock; package installation awaits validation. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Initial support for packaged web apps. Legacy privileged APIs and hosted apps not restored. No release at this stage. +![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : Install, launch and uninstall packaged web apps. +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Vulpes catalogue on the home screen, in French and English, with its original icon. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Security](https://img.shields.io/badge/Security-475569?style=flat-square) : Installed apps kept separate from system apps. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Compatibility](https://img.shields.io/badge/Compatibility-475569?style=flat-square) : Some old Firefox OS apps and APIs are not yet supported. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Installation and use of 2048 checked. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : 2048 installed, preserved after restart and uninstalled on an Android emulator. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Home screen checked; app installation still needs validation on Pixel. -## 2.7-preview.16 — APK built · 5 October 2026 +## 05/10/2026 : 2.7-preview.16 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Restored Gaia wallpaper and sound pickers, return to Settings and cancellation through Home. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Apply language changes to Home and preserve them after restart. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Restore horizontal page snapping; hide development apps on Home. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Vulpes startup logo and sound list adapted to the current engine. Media transport shared by desktop and Android. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android: Gaia locking after sleep and Back from the lockscreen camera. HOME launcher mode validated. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Android: hide system bars in immersive mode, with swipe access. Preview16 APK built and signed. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop and Android 16/API 36 emulator: checked wallpapers, sounds and panels; tested language, locking and wallpaper persistence on Android. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: updated the boot image to stop restoring outdated files. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo in RAM: 6 UI and 10 system checks passed. Installed build remains Preview15, without flashing. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) APK not published. FFAA installation and call audio await validation; Gaia sound selection does not change the Android ringtone. +![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Vulpes startup logo. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Home](https://img.shields.io/badge/Home-475569?style=flat-square) : Unwanted horizontal scrolling removed; test apps hidden. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Customization](https://img.shields.io/badge/Customization-475569?style=flat-square) : Wallpaper and sound selection restored. Home screen language applied and preserved after restart. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : APK built, not published; Pixel image tried without permanent installation. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Android bars hidden and accessible by swiping; launcher mode checked. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Lock screen](https://img.shields.io/badge/Lock%20screen-475569?style=flat-square) : Return from sleep and the lock screen camera fixed. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Old files no longer overwrite updates at startup. -## In development — 4 October 2026 — Standalone Sargo installation +## 04/10/2026 : Standalone installation -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: standalone ext4 userdata volume with system, data and vendor/modem components. Installation independent of Droidian and ADB. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Fastboot installer with model, unlock, size and checksum checks. Replaces userdata, dtbo_a, vbmeta_a and boot_a; retains calibration. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Full userdata backup and recovery archive verified before flashing. Actual restoration not tested. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Two installed boots passed: 11 Gaia and 10 native checks per boot, retained settings and matching boot readback. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Variant without SSH or maintenance keys booted after flashing. Development variant reinstalled; camera, keyboard and notifications checked. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Local Fastboot package assembled; 44 targeted tests passed. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Package unpublished: hardware component provenance and redistribution pending. Tested on one Pixel 3a; 8 GiB volume with 1 GiB writable, without automatic expansion. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Installer with device and file checks before writing. +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Standalone Vulpes installation without going through Droidian. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Package not published; tested on one Pixel only. Installation replaces phone data. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Recovery](https://img.shields.io/badge/Recovery-475569?style=flat-square) : Backups checked; full restoration still needs testing. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Installed boots, saved settings, camera, keyboard and notifications checked. -## In development — 3 October 2026 — Per-device Sargo installation +## 03/10/2026 : Per-device installation -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: portable device workspace for builds, installation and recovery, independent of the development Pixel inventory. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Read-only collection of six boot partitions and storage, bound to the phone identity. Private backups. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) SSH transfer with identity, storage and checksum checks, without overwriting, formatting or flashing. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Two RAM boots: 11 Gaia and 10 native checks passed each; setting retained. Autofocus timed out on the first trial; camera worked on the second. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Return to the installed build verified; boot unchanged and data overwrite rejected. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Autofocus timeout not considered fixed. Exact HAL provenance still pending; qualified kernel and compatible ext4/LVM storage required, without direct installation from stock Android. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Preparation adapted to each Pixel, with device-specific backups. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Focus sometimes times out; issue still open. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Direct installation from stock Android not yet available. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Temporary boots, saved settings and return to the previous installation checked. -## In development — 3 October 2026 — Sargo preparation and recovery tools +## 03/10/2026 : Installation and recovery -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: local package preparation with checksum checks, bounded extraction, ext4 validation and fresh data creation without overwriting. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Private recovery kit with boot_a backup and model, serial, slot and checksum checks. User data not included. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Restoration works without the diagnostic image. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) System builds require a complete ARM64 hardware reference. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) System archive prepared and recovery kit checked locally. Installation on another Sargo pending; no flash or ROM release. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) JSON changelog included in future source releases; working documents excluded. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Package preparation and recovery kit with a boot backup. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Recovery](https://img.shields.io/badge/Recovery-475569?style=flat-square) : Restoration possible without booting the diagnostic tool. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Preparation checked locally; installation on another Pixel still needs completion. + +### ![Web](https://img.shields.io/badge/Web-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Changelog](https://img.shields.io/badge/Changelog-475569?style=flat-square) : Shared history included in upcoming source releases. -## In development — 3 October 2026 — Sargo modem recovery and fresh installation +## 03/10/2026 : Modem and first startup -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: corrected font cache and first-boot creation of oFono’s private directory in the system image. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Modem recovery without rebooting the phone. Network registration took about 22 seconds in a controlled trial. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Fresh profile: checked Gaia, hardware rendering, Fira, both cameras, focus, zoom, keyboard and notifications. Wi-Fi scan worked after modem restart. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Two boots retained settings in a separate data image. Existing installation preserved. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) IMS watchdog root cause unresolved. Public installation and recovery package still incomplete; no image released. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Recover the modem without restarting the whole phone. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Fonts and modem initialization fixed on a fresh installation. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : Intermittent modem restarts still need fixing; public package incomplete. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Cameras, focus, zoom, keyboard, notifications and Wi-Fi search checked. -## October 1, 2026 — Sargo distribution preparation — in development +## 01/10/2026 : Preparing distribution -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: rebuilt Preview15 image with empty profiles, licenses and an inventory of 493 packages. Working documents excluded. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Mount table generated from the storage inventory. Support limited to a single ext4 extent on userdata. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) First-boot font cache permissions: run fc-cache as the session user. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Filesystem, content and transfer checks passed. RAM trials left boot_a unchanged; return to v59 verified. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) SIM, LTE, Wi-Fi scan, Gaia, hardware rendering, Fira, cameras, keyboard and notifications checked in RAM. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Targeted recovery after tracing intermittent reboots to IMS firmware. Second boot passed; recovery from another IMS crash not tested. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Image qualification incomplete; end-to-end calls, SMS and mobile data unvalidated. Image unpublished and non-flashable. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Preparation of an image with clean user data. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Fonts](https://img.shields.io/badge/Fonts-475569?style=flat-square) : Font display on first boot fixed. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Image not published. Calls, SMS and mobile data still need end-to-end testing. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : Intermittent modem restart identified. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : SIM, 4G, Wi-Fi search, cameras, keyboard and notifications checked in a temporary boot. -## 2.7-preview.15 — 30 September 2026 — published +## 30/09/2026 : 2.7-preview.15 -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) First publication of desktop, Android and Tundra sources, with French/English READMEs, licenses and setup scripts. Private files excluded. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS: corrected bubble dates and sent/failed states. Improved camera stream cleanup and replacement. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Desktop: stabilized navigation checks, adjusted cold-start timeout and clean shutdown after Gaia times out. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop with Gecko 156.0.1: 42 service tests, startup, navigation, settings, gestures, history, isolation and persistence checked. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview15 APK signed with the previous key and GeckoView 156.0; asset parity verified. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Android 16 emulator: validated update, Camera/Gallery, camera resume, ten background returns and renderer recovery. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo: sources included, private v59 retained. No generic ROM; boot depends on storage layout and preinstalled images. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo: preview around 16 fps; flash, video, rotation and deep suspend incomplete. Call audio and the dialog after SMS sending need investigation. +![Published](https://img.shields.io/badge/Published-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Source code](https://img.shields.io/badge/Source%20code-475569?style=flat-square) : First publication of Desktop, Android and Tundra source code, with French/English project overviews. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : More reliable camera stream shutdown and replacement. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Dates and sending statuses fixed in conversations. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : Navigation, settings, gestures and saved data checked. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : Update, Camera, Gallery and returns from the background checked on an Android emulator. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Source code included; universal installation still unavailable at this stage. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Flash, video, rotation, sleep and call audio still incomplete or awaiting tests. [Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.15) -## In development — SMS and camera feedback · 30 September 2026 +## 30/09/2026 : SMS and camera follow-up -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS: convert dates to fix empty conversations. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera: corrected stream and sensor cleanup; an old session can no longer close its replacement. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: physical vibration shutdown through DRV2624, with a safeguard at service startup and exit. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: SMS composition and display checked with a simulated modem. Sargo: camera switching and shutdown tested over two RAM boots. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v54: user confirmed focus, zoom and two-way SMS. Five conversations displayed; vibration shutdown confirmed. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo v59 installed on boot_a after two RAM boots; startup, readback and slot A verified. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Post-SMS dialog and camera smoothness still pending. Shared sources updated, without a new APK. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Camera release and switching fixed. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Empty conversations fixed. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Shared sources updated, without a new APK. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Vibration now stops correctly. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Remaining work](https://img.shields.io/badge/Remaining%20work-475569?style=flat-square) : Dialog after sending SMS and camera smoothness still need fixing. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Focus and zoom confirmed by the user. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Sending and receiving confirmed by the user; conversations displayed. -## In development — Messages and Camera · 30 September 2026 +## 30/09/2026 : SMS and photos -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Desktop/Tundra: retain SMS after modem rejection and pass sending, failed and sent states to Gaia. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: persist SMS states after the oFono object disappears; reject sending when the modem is unregistered. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: touch focus, digital zoom and sensor JPEG capture in Gaia Camera. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Measured photos: 4032 × 3024 rear, 3264 × 2448 front. Preview 640 × 480; fixed front focus. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Native camera: separate binary data from HAL logs, bound responses and resume preview after capture or focus errors. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: checked visible send failures and Camera/Gallery workflows. Sargo v54: validated two RAM boots, installation, persistence and camera. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Unstable network; no end-to-end SMS delivery confirmed in this pass. Modem confirmation is not a delivery receipt. Public APK unchanged (Preview14). +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Failed messages preserved and sending statuses updated. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Preview 14 APK unchanged at this stage. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Tap to focus and digital zoom. Photos up to 12 MP at the rear and 8 MP at the front. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Preview return after taking a photo fixed. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Delivery to the recipient not yet confirmed. -## 2.7-preview.14 — APK published · 30 September 2026 +## 30/09/2026 : 2.7-preview.14 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) System information: version alignment and Fira fonts in Shadow DOM components. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Desktop/Tundra: portrait key sizing, cursor placement in the active field and stale input replies. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Desktop/Tundra: Gaia keyboard bridge and numeric keypad for SMS recipients. Android keeps its system keyboard. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Lockscreen: resize without a keyboard window. Honour silent notifications, including after restoration. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: persistent tray and lockscreen notifications, opening the owning application. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: cancellable vibrations capped at ten seconds; private persistent Wi-Fi profiles, automatic reconnection and network removal. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: store incoming SMS before acknowledgement, remove duplicates and create the state directory. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: earpiece/speaker, microphone mute and call-volume controls. Routing, mute and volume tested outside a call. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Installer: reject flashing diagnostic images with a debugger. Sargo v48 installed after two RAM boots; persistence, readback and slot A verified. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: Calendar and keyboard checked. Sargo: keyboard, notifications and Wi-Fi reconnection checked; notification sound and real telephony await validation. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview14 APK signed and published. Startup, versions and fonts checked on an Android 16 emulator. No Sargo image released. +![Published](https://img.shields.io/badge/Published-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Fonts, version information, lock screen and notifications aligned. + +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Keyboard](https://img.shields.io/badge/Keyboard-475569?style=flat-square) : Larger keyboard, improved text editing and recipient number entry. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Startup and fonts checked on an Android emulator. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Vibration stopping fixed. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Notifications preserved, conversation opening and duplicate messages fixed. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Saved networks, reconnection and forgetting a network fixed. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Audio](https://img.shields.io/badge/Audio-475569?style=flat-square) : Audio controls tested outside calls; conversation audio and notification sounds still need testing. [Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.14) -## 2.7-preview.13 — application workflows · 27 September 2026 +## 27/09/2026 : 2.7-preview.13 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Calendar: save events with alarms, report scheduling errors and skip reminders for deleted events. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Notifications: accept empty text; do not mark rejected notifications as delivered. Native Tundra support still incomplete. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Gallery: thumbnail sizing at hidden startup and cancellation of updates after closing the editor. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS: apply correspondent, read-state, date and delivery filters. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: checked WebM playback, photo editing and copying, calendar, conversation reading and deletion. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Isolated checkout: startup, desktop tests, persistence and Android packaging passed. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview13 APK built and signed. Camera/Gallery, Calendar, ten background returns and renderer recovery validated on emulated Android 16. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v40 installed after two RAM boots; Gaia, camera, Wi-Fi, brightness, controls and boot_a readback verified. +![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Calendar](https://img.shields.io/badge/Calendar-475569?style=flat-square) : Event reminders fixed, including after deletion. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Gallery](https://img.shields.io/badge/Gallery-475569?style=flat-square) : Initial display and closing the editor fixed. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Conversation filters fixed. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : Photo, video, calendar and conversations checked. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : Camera, Gallery, Calendar and background resume checked. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Camera, Wi-Fi and brightness checked on the installed version. -## 2.7-preview.12 — application review · 27 September 2026 +## 27/09/2026 : 2.7-preview.12 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Gaia icons: restored 1× to 2.25× variants across 1,047 CSS references. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera: enable switching after sensor detection and prevent pinch zoom on the UI. Unavailable flash disabled. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Home: restore long press and gesture forwarding without additional privileges for websites. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Browser: local bilingual welcome page following Gaia’s language without restarting. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS: corrected identifiers, migration, dates, sending events, multi-recipient requests and concurrent writes. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Calendar: restored the current-day accessibility label in 37 languages. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Reviewed 14 apps; 26 Gallery/Music/Clock/UI checks, Contacts/SMS tests and web isolation checks. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview12 APK rebuilt with shared assets; parity verified. Hardware features handled separately on Android and Tundra. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: shader-based NV21 preview and binary transport, about 23 fps measured versus 8 in the intermediate trial. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: wait for camera worker shutdown before switching sensors; manual brightness reaches its target in about 200 ms. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: Wi-Fi power control from Gaia and WPA-PSK connections to mixed WPA2/WPA3 networks. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: scan, connection and HTTPS validated in RAM. v38 installed after two RAM boots, with readback and slot A checks. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo: temporary Wi-Fi profiles; flash, video, sensors, Bluetooth, data counters and advanced call controls incomplete. +![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Browser](https://img.shields.io/badge/Browser-475569?style=flat-square) : Local start page, in French or English according to language. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : SMS conversations and Calendar translations fixed. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Camera switching and interface zoom fixed; flash disabled when unavailable. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Sharper icons, long press on Home and gestures fixed. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Smoother preview, at around 23 frames per second in testing. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : More responsive brightness and Wi-Fi connection fixed. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Video, flash, Bluetooth and advanced call settings remain incomplete. -## In development — Sargo feedback and interface · 27 September 2026 +## 27/09/2026 : Interface and hardware -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Gaia shutdown animation recoloured blue. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Phone: keep headers fixed when changing tabs and use call-log icons up to 2.25× density. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Clipped dropdown text and overflowing Video welcome text. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Brightness: numeric values and coalesced stale commands, preserving sleep/wake order. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Home: wallpaper under the gradient and right-side button in landscape, without covering apps. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Browser: editable local welcome page, retaining private mode. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wi-Fi: error message and Retry button instead of endless retries. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Preview11 APK built and signed; rotation and Home button placement checked on emulated Android 16. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: preview, JPEG and camera switching validated in RAM. Capture limited to 640 × 480; flash and video unavailable. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v33 installed after two RAM boots; startup, data, readback and slot A verified. Brightness and Wi-Fi results checked in Gaia. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: PulseAudio 14 compatibility and duplicate audio module loading. Call/media profiles and earpiece tested. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo: call audio, full-resolution capture, video and automatic rotation await validation. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Browser](https://img.shields.io/badge/Browser-475569?style=flat-square) : First local start page. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Shutdown](https://img.shields.io/badge/Shutdown-475569?style=flat-square) : Original shutdown animation retained, with blue circles. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : List and Video text fixed; transparent Home bar adapted to landscape. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Phone](https://img.shields.io/badge/Phone-475569?style=flat-square) : Call history headers and icons fixed. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Brightness](https://img.shields.io/badge/Brightness-475569?style=flat-square) : Brightness adjustment connected. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Call audio, video, full-resolution photos and rotation still need testing. -## In development — native Wi-Fi stability · 27 September 2026 +## 27/09/2026 : Wi-Fi stability -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wi-Fi: restore the 20-second scan interval and coalesce concurrent scans. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: one hardware scan at a time, with a short cache cleared on connect/disconnect. Fixes memory exhaustion in v21/v22. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Wi-Fi burst, failure and timer tests. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Shared Preview9 version, Gaia 2.7.0; new APK with the same sources. Android still manages its own Wi-Fi. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v25: two RAM boots then installation, 11 Gaia and 10 system checks passed, without low-memory process kills. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Checked locking, fonts, battery, date and Wi-Fi; tested sleep/wake and volume with injected events. Data, readback and slot A verified. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Native camera and full call validation still pending. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Preview 9 built with shared fixes; Wi-Fi handled by Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Network discovery stabilized to avoid phone freezes. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Camera and calls remain incomplete. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Lock screen, fonts, date, battery and Wi-Fi checked. -## In development — Gaia restoration · 27 September 2026 +## 27/09/2026 : Restoring Gaia components -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Restored Gaia Settings, Usage, FM and import panels. Temporary interfaces removed; unavailable features disabled. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Corrected legacy component styles, lockscreen icons and Phone glyphs. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Reserve 44 pixels for Home; restore date and battery without `{{ level }}` placeholders. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Gaia lockscreen re-enabled, splash stabilized, Browser name localized and credits added. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: 26 app checks passed, plus panels, imports, battery, navigation and simulated calls. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview8 APK installed on emulated Android 16: Android battery, settings access and optional HOME mode. Android app catalogue still incomplete. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Emulated Android: ten background returns, renderer recovery and asset parity checked. Gaia locking remains separate from Android security. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo v21/v22: Wi-Fi scan and association connected to Gaia through NetworkManager. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: RAM trials interrupted by display-service failure (code 139). Return to installed v20 verified, without a new flash. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Candidate Wi-Fi, camera, SIM/Bluetooth APIs and CPU suspend unvalidated. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![About](https://img.shields.io/badge/About-475569?style=flat-square) : Credits, startup screen and browser name updated. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Original Gaia panels and styles restored in Settings, Data Usage, FM Radio and imports. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Home button no longer overlaps controls; date, battery and lock screen restored. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Integration](https://img.shields.io/badge/Integration-475569?style=flat-square) : Launcher mode, access to Android settings and background resume. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Initial integration unstable; returned to the previous version. -## In development — 27 September 2026 +## 27/09/2026 : Calls and hardware buttons -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Gaia Callscreen for incoming/outgoing calls, answer and hangup. Replaces the temporary v13 screen. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Persistent call log with acknowledgement and duplicate detection. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Distinguish unknown battery state from empty battery; tolerate missing or malformed Contacts indexes. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Render system text with Fira Sans while preserving icon fonts. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop with simulated modem: calls, failed hangup and retry, history, sleep/wake, Power menu, volume and battery. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: Power/Volume buttons connected to Gaia, with native screen, volume, shutdown and reboot controls. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: serialize brightness and power changes to prevent a black screen on wake; fix PulseAudio access for volume. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: successful hangup with an empty D-Bus reply no longer produces a false error. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v13 then v20 installed after RAM trials; startup, readback, settings and slot validation checked. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Real outgoing call reached ringing and was hung up. Incoming calls and conversation audio unvalidated. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera diagnostics: a timeout no longer counts as successful initialization. Two sensors detected, without received frames. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Native camera unavailable, CPU suspend and advanced audio controls incomplete. No new APK. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Phone](https://img.shields.io/badge/Phone-475569?style=flat-square) : Gaia incoming and outgoing call interfaces, with call history. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Fira fonts, contacts and battery display fixed. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Buttons](https://img.shields.io/badge/Buttons-475569?style=flat-square) : Support for Power and Volume keys, shutdown menu and waking the screen. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Native camera still unavailable. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Calls](https://img.shields.io/badge/Calls-475569?style=flat-square) : Ringing and hanging up checked; conversation audio still needs testing. -## In development — 26 September 2026 +## 26/09/2026 : Startup and fonts -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Use historical Fira Sans fonts in Gaia and Tundra; correct sans-serif fallback and Fontconfig checks. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Removed diagnostic buttons from Settings. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Hardware panel: pass platform capabilities correctly to display the battery. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: distinguish modem and transport errors; correct the unavailable-camera message. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: persistent data on a 2 GiB ext4 image and A/B success validation after installation. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v8: two boots with persistence, 9 Gaia and 9 system checks per boot. Installation and recovery tools tested locally. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v9 installed on boot_a: two boots with 10 Gaia and 9 system checks each. Matching readback, five other partitions preserved; actual restoration untested. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Normal startup without automatic diagnostic gestures; fullscreen before Gaia, stable 360 × 740 CSS-pixel layout. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Separate `--diagnostics` mode; diagnostic images excluded from normal launch. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: v13 tested in RAM (8 startup, 9 system checks), v14 diagnostics (13 interactive checks), including Wi-Fi. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) UMTS registration, audio playback and microphone signal checked. Call audio, camera and suspend unvalidated. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Ramdisk builds independent of the desktop language by running readelf in the C locale. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Private trials, without a public ROM. Desktop sources synchronized; shared Android fix available, without a new APK. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Fira fonts and battery information fixed; test buttons removed from settings. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Data preserved in the installed boot. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Stable fullscreen, without automatic gestures or app launches. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Sound and microphone tested separately; call audio, camera and sleep not validated. -## In development — 25 September 2026 +## 25/09/2026 : Home screen and first native trials -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Round Home button, transparent wallpaper gradient and blue bar inside apps. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Hide the gradient at the bottom and restore it when scrolling; remove the blue rectangle when pressing Home. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Bundled Fira Sans weights and italics; separate product, Gaia, engine and platform versions. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Resume icon loading after an initial zero-size measurement on all three platforms. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: icons, navigation, permissions and French/English information panel checked with Gecko 156.0.1. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android: retain navigation state after activity recreation. Java compilation passed; visuals need retesting, no new APK delivered. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Tundra: ext4 image with ARM64 runtime, HAL, Phoc, Gecko and Gaia; small fixes bundled in the ramdisk. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: dedicated backend, Pixel 3a information and hardware battery readings. Build sources archived with checksums. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: hardware WebRender, icons and fonts checked on a physical display capture. v5: 10 Gaia and 8 system checks passed. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: add pd-mapper, disable uninitialized IPA and premature camera probing. Copy modem NV data to RAM for trials. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v6: Wi-Fi scan, connection, IPv4, DNS and HTTPS verified; 13 Gaia and 9 system checks passed. Gaia network selection still pending. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) RAM trials without flashing, automatic return after ten minutes and changes lost at shutdown. Cold boot passed; warm compositor restart failed. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) No public ROM; modem, audio, camera and suspend still need integration or validation. +![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square) + +### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Home](https://img.shields.io/badge/Home-475569?style=flat-square) : Round button, transparent background on Home and blue background in apps. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Pressed button state, gradient, fonts and system information fixed. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : App resume changed in source code, not yet tested on Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : First native image trials with accelerated display and battery support. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Temporary trials; many hardware features still need connecting. -## 2.7-preview.7 — APK built, local reference +## 2.7-preview.7 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Desktop camera permission and recovery after the first Android permission prompt. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Separate messages for denied permission, missing sensors and opening failures. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Separate product and engine versions: Vulpes Preview7, Gaia 2.7.0, desktop Gecko 156.0.1 and Android GeckoView 156.0. +![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square) + +### ![Desktop + Android](https://img.shields.io/badge/Desktop%20%2B%20Android-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![About](https://img.shields.io/badge/About-475569?style=flat-square) : Vulpes, Gaia and Gecko versions shown separately. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Improved permission handling and clearer error messages. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Resume after the first permission request fixed. -## 2.7-preview.6 — APK built +## 2.7-preview.6 -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Gaia Camera on desktop and Android: preview and JPEG capture through webcam or GeckoView. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Save photos in Gallery and import through the system picker. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Flash and video disabled; camera switching depends on available sensors. +![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square) + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Gaia Camera app connected to the webcam. +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Gallery](https://img.shields.io/badge/Gallery-475569?style=flat-square) : File import and photos available in Gallery. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Camera switching depends on hardware; flash and video unavailable. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Gaia Camera app connected to Android cameras. +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Gallery](https://img.shields.io/badge/Gallery-475569?style=flat-square) : File import and photos available in Gallery. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Camera switching depends on hardware; flash and video unavailable. -## 2.7-preview.5 — APK built +## 2.7-preview.5 -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Versions centralized in `release.json`; product, Gaia and engine separated. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Shared desktop/Android native interface and APK asset parity checks. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Desktop: Linux settings, media/vCard imports, notifications and test webcam capture. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Android: foreground return and recovery after renderer termination. +![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square) + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Integration](https://img.shields.io/badge/Integration-475569?style=flat-square) : System settings, media and contact imports, notifications and webcam test. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Interface and version numbering aligned with Android. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Interface and version numbering aligned with Desktop. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : Improved background resume and display recovery. -## 2.7-156.0.2 — Historical APK built (revision 4) +## 2.7-156.0.2 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android: activity and session recovery to reduce blank screens. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Access to Android settings, volume and window brightness. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Media and contact imports; native notifications with permissions. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Handoff to Android Phone, SMS, Clock and Camera. No silent sending or replacement of default apps. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Historical numbering: Android engine Gecko 156.0, despite the 2.7-156.0.2 name. +![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square) + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Integration](https://img.shields.io/badge/Integration-475569?style=flat-square) : Android settings, sound, brightness, imports and notifications. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : Calls, SMS, clock and camera handled by Android apps. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : White screens and background resume fixed. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Version](https://img.shields.io/badge/Version-475569?style=flat-square) : Historical numbering: this number does not represent a Gecko update. -## 2.7-156.0.1 — APK published (revision 3) +## 2.7-156.0.1 -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) “Vulpes OS - Preview” name and project icon. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wallpaper flickering corrected. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Historical numbering, separate from the Android engine version. +![Published](https://img.shields.io/badge/Published-334155?style=flat-square) + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Branding](https://img.shields.io/badge/Branding-475569?style=flat-square) : “Vulpes OS – Preview” name and project icon. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Home](https://img.shields.io/badge/Home-475569?style=flat-square) : Wallpaper flickering fixed. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Version](https://img.shields.io/badge/Version-475569?style=flat-square) : Historical numbering retained to identify this release. [Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-156.0.1) -## 2.7-preview.2 — APK published +## 2.7-preview.2 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wallpaper flickering in the Android Preview. +![Published](https://img.shields.io/badge/Published-334155?style=flat-square) + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Home](https://img.shields.io/badge/Home-475569?style=flat-square) : Wallpaper flickering fixed. [Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.2) -## 2.7-preview.1 — APK published +## 2.7-preview.1 -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) First Android Preview with Gaia and GeckoView. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Archived version; known wallpaper flickering issue. +![Published](https://img.shields.io/badge/Published-334155?style=flat-square) + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Preview](https://img.shields.io/badge/Preview-475569?style=flat-square) : First Android Preview to try Vulpes without flashing the phone. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Home](https://img.shields.io/badge/Home-475569?style=flat-square) : Known wallpaper flickering in this first version. [Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.1) -## Earlier milestones — technical retrospective +## Early milestones -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Historical Gaia base with Vulpes branding, wallpaper, translations and system information. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Experimental Gecko 45 to 52 port, followed by separation of Gaia, services and engine. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) APIs for settings, apps, contacts, messages, alarms, storage and inter-app communication. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Adapt Gaia components, touch gestures, browser and apps to recent engines. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Gecko updates with checks and rollback; Gaia updates without rebuilding the engine. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Archived Firefox OS apps, QEMU, then ARM64 Gecko inside Droidian and under a dedicated compositor. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: inventory, boot backups, separate root, HAL services and Tundra PID 1. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Temporary graphical Fastboot trials with SSH recovery and automatic return. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Kernel 4.9-124-google-sargo, Android 9/API 28 adaptation. Historical milestones, without newly dated releases. +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : Adaptation of contacts, messages, settings, alarms and storage. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Branding](https://img.shields.io/badge/Branding-475569?style=flat-square) : Creation of Vulpes: visual identity, translations and system information. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Engine](https://img.shields.io/badge/Engine-475569?style=flat-square) : Move from old Firefox OS engines to a modern Gecko. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : First native boots and hardware trials on Pixel 3a. diff --git a/CHANGELOG.md b/CHANGELOG.md index ac32180c..f047bd5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,576 +2,903 @@ [English](CHANGELOG.en.md) -PC, Android (APK) et Tundra/Sargo. Les statuts indiquent des sources en développement, un APK construit ou une version publiée. Les changements des sources nécessitent une mise à jour du paquet installé. +Les nouveautés, par date et par plateforme. Dans chaque groupe : Add, Change, Fix, Note, Test. Les entrées décrivent la situation à leur date ; une correction en développement nécessite une nouvelle version installée. + + + +## 14/10/2026 : 2.7-preview.21 + +![APK publié](https://img.shields.io/badge/APK%20publi%C3%A9-2F855A?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Affichage](https://img.shields.io/badge/Affichage-475569?style=flat-square) : Messages des fonctions indisponibles plus lisibles en thèmes clair et sombre. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Clavier](https://img.shields.io/badge/Clavier-475569?style=flat-square) : Dictionnaires supplémentaires disponibles hors ligne ; activation et reprise du clavier Gaia fiabilisées. La vérification sur les appareils concernés reste nécessaire. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Journal d’appels](https://img.shields.io/badge/Journal%20d%E2%80%99appels-475569?style=flat-square) : Affichage du nom des contacts rétabli au premier chargement du journal. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Panneaux Stockage rétablis. Une erreur de chargement ne bloque plus les autres menus. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-2F855A?style=flat-square) ![Données Android](https://img.shields.io/badge/Donn%C3%A9es%20Android-475569?style=flat-square) : Lecture des contacts, SMS et journaux Android dans Gaia, après autorisation. Les données locales de Vulpes sont conservées. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Retour vers Vulpes sans écran blanc persistant ; un catalogue fermé peut être rouvert. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Clavier](https://img.shields.io/badge/Clavier-475569?style=flat-square) : Le rectangle blanc signalé reste à reproduire sur les appareils concernés. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Données Android](https://img.shields.io/badge/Donn%C3%A9es%20Android-475569?style=flat-square) : Première étape en lecture seule, hors MMS. Envoi et édition des données Android dans les applications Android ; les nouveaux contacts Gaia restent locaux. Accès SMS et journal selon les autorisations de la ROM et de l’installateur. Essais sur Android 9 ; autres versions à confirmer. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Les corrections communes de Gaia sont incluses dans les images complètes et les mises à jour de démarrage. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Nouvelle image d’installation construite ; démarrage et flash sur Pixel à vérifier avant publication. -## 2.7-preview.20 — APK construit · 13 octobre 2026 +## 13/10/2026 : 2.7-preview.20 -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview 20 réunit les corrections communes depuis l’APK Preview 17 : paramètres Gaia, apparence, sélecteurs, clavier, contacts, Marketplace et médias. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Photo : enregistrement WebM avec miniature et lecture dans Galerie/Vidéo. Autorisation micro demandée ; commandes adaptées aux capacités du matériel. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Caméra : changement de capteur, arrêt et reprise fiabilisés. PC et Android utilisent leurs API caméra ; Sargo conserve son adaptateur HAL. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : mises à jour Wi-Fi, Bluetooth, appels, SMS/MMS et réglages réseau incluses dans les sources. Les fonctions non raccordées restent indiquées dans les panneaux. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Changelog : reprise des textes simplifiés FR/EN, badges conservés, filtres PC/APK/Sargo indépendants des titres. Markdown, site et notes de release issus du même JSON. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) APK signé avec la clé des Preview précédentes ; alignement et cohérence des 53 fichiers partagés vérifiés. Validation d’exécution Android en cours. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Gecko PC/Sargo 156.0.1 ; GeckoView Android 156.0. Gaia 2.7.0. L’APK délègue appels/SMS à Android : il ne remplace pas le système téléphonique Android. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Preview expérimentale : Compte Mozilla/Sync, localisation distante, extensions Firefox OS et transfert USB restent incomplets. Sargo : aperçu autour de 16 FPS ; son des vidéos et audio téléphonique à qualifier séparément. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Pixel 3a : Preview 20 r62 démarrée en RAM puis flashée sur boot_a. Empreinte relue identique ; démarrage installé, onze contrôles Gaia et dix contrôles natifs réussis. Données conservées, Wi-Fi connecté et enregistrement LTE observé. Pas de nouvelle conversation audio testée. +![Publié](https://img.shields.io/badge/Publi%C3%A9-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Mode vidéo, avec miniature et lecture dans Galerie et Vidéo. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Améliorations des paramètres, de l’apparence, des sélecteurs, du clavier, des contacts et des médias. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Changement de capteur, arrêt et reprise fiabilisés. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Services](https://img.shields.io/badge/Services-475569?style=flat-square) : Compte Mozilla, Sync, localisation distante, extensions et transfert USB restent incomplets. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Publication](https://img.shields.io/badge/Publication-475569?style=flat-square) : APK Preview 20 disponible. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Compatibilité](https://img.shields.io/badge/Compatibilit%C3%A9-475569?style=flat-square) : Appels et SMS utilisent Android. Cette Preview n’a pas encore été validée en utilisation sur Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Aperçu autour de 16 images par seconde. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Mise à jour du Wi-Fi, du Bluetooth, des appels, des SMS/MMS et des réglages réseau. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Audio](https://img.shields.io/badge/Audio-475569?style=flat-square) : Son des vidéos et conversation téléphonique à vérifier séparément. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Preview 20 installée sur le Pixel 3a, données conservées. Wi-Fi connecté et réseau 4G détecté. + +### ![Web](https://img.shields.io/badge/Web-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Changelog](https://img.shields.io/badge/Changelog-475569?style=flat-square) : Historique FR/EN simplifié, badges et filtres par plateforme. Même contenu pour le site et les releases. + +[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.20) -## En développement — 12 octobre 2026 — Vidéo et réglages de l’heure +## 12/10/2026 : Vidéo et heure -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Photo : enregistrement WebM VP8/Opus avec autorisation micro, miniature et stockage. Tampon limité à 32 Mio, arrêt avant libération du capteur. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Photo, Galerie et Vidéo : prise en charge des fichiers WebM et de leurs miniatures. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Paramètres : véritables sélecteurs Date/Heure Gaia, retour du clavier intégré et lettres non tronquées dans les listes. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Améliorer Vulpes : lien vers les tickets du projet. Services non raccordés expliqués dans leurs panneaux. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : vidéo simulée 1920 × 1080 relue ; photo, galerie, reprise caméra et navigation vérifiées. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo r61 en RAM : vidéo 480 × 640 relue, huit bascules avant/arrière réussies. Médias de test supprimés ; son enregistré non écouté. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : aperçu mesuré autour de 16 FPS contre 12 dans le test précédent. 30 FPS restent à atteindre. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : heure automatique par NITZ, réglage persistant et protection des écritures manuelles. Synchronisation dépendante du réseau ; pas de NTP de secours, fuseau choisi manuellement. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Android : ressources préparées et Java compilé, sans nouvel APK ni test vidéo Android à cette étape. Compte Mozilla/Sync, localisation distante, extensions Firefox OS et transfert USB restent à implémenter. Aucun flash ni publication. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Enregistrement vidéo avec son, miniature et lecture dans Galerie et Vidéo. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Aide](https://img.shields.io/badge/Aide-475569?style=flat-square) : « Améliorer Vulpes » mène aux tickets du projet. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Sélecteurs de date et d’heure rétablis ; retour du menu Clavier et texte des listes corrigés. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Enregistrement vérifié avec une caméra simulée. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Changements préparés pour un prochain APK ; vidéo non encore testée sur Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Aperçu amélioré, autour de 16 images par seconde. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Horloge](https://img.shields.io/badge/Horloge-475569?style=flat-square) : Heure automatique selon les informations du réseau ; fuseau horaire encore manuel. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Vidéo et changement de capteur vérifiés. Son des vidéos encore à écouter. -## En développement — 12 octobre 2026 — Appels et partage Wi-Fi +## 12/10/2026 : Appels et partage Wi-Fi -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Dialogues Gaia : fermeture après ouverture, transitions interrompues et nouvelle saisie après validation refusée. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : délai des services opérateur augmenté ; réglages lents séparés des commandes voix/SMS. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : double appel, présentation du numéro et quatre règles de renvoi raccordés à oFono, avec validation et relecture. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : point d’accès Wi-Fi WPA2 ou ouvert, configuration NetworkManager et pare-feu adapté. Mot de passe privé, accessible uniquement à Paramètres. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) r59 en RAM : 69 panneaux, dialogues et APN vérifiés sur PC/Pixel. Point d’accès enregistré, activé puis arrêté depuis Gaia ; Wi-Fi précédent restauré. 44 tests Python et régressions des dialogues réussis. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Transit Internet vers un autre appareil non testé. Messagerie vocale, blocage d’appels, PIN/PUK, certificats Wi-Fi et partage USB restent ouverts. Ressources Android synchronisées ; aucun nouvel APK, flash ou publication. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Fermeture des dialogues et nouvelle tentative après une erreur corrigées. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Appels](https://img.shields.io/badge/Appels-475569?style=flat-square) : Réglages du double appel, de l’affichage du numéro et du renvoi d’appel. +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Partage de connexion avec ou sans mot de passe. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Les réglages lents ne bloquent plus les appels et les SMS. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Activation du point d’accès vérifiée ; accès Internet d’un autre appareil encore à tester. -## En développement — 12 octobre 2026 — Paramètres réseau +## 12/10/2026 : Paramètres réseau -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wi-Fi : adresse IPv4 et débit réels ; ne plus afficher « undefined » lorsqu’une mesure manque. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : choix GSM/UMTS/LTE et modification des APN Internet/MMS existants, avec validation et relecture. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) APN : refuser les changements d’un profil actif, protéger IMS et les mots de passe, tenter la restauration après échec et signaler son résultat. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : file bornée pour les réglages lents. Lecture des appels en 20 ms pendant une attente de réglages de 5 secondes. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 38 tests Python, 69 panneaux PC et parcours APN/réseau sur Pixel en RAM vérifiés. Ressources Android synchronisées. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Ajout, suppression et réinitialisation des APN indisponibles. Sélection manuelle d’opérateur et certificats encore ouverts. Aucun nouvel APK, flash ou publication. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Adresse IP et vitesse de connexion affichées correctement. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Choix du type de réseau et modification des points d’accès mobiles. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Réglages réseau plus fiables lorsque le modem répond lentement. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Ajout, suppression et réinitialisation des points d’accès encore incomplets. -## En développement — 12 octobre 2026 — Audit des paramètres +## 12/10/2026 : Revue des paramètres -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Paramètres : navigation récupérable après échec d’un contrôleur ou d’un dialogue ; génération cohérente des modules. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Filtres d’accessibilité et assistance Vulpes. Panneaux d’origine conservés avec explication des fonctions indisponibles. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) PC : statistiques du profil et téléchargements Gecko. Android : statistiques du stockage privé. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : données mobiles, itinérance, horloge et Wi-Fi masqué raccordés. Erreurs des anciennes interfaces réseau du panneau Son corrigées. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 97 vues inventoriées ; 69 panneaux PC/Pixel ouverts et sept dialogues natifs vérifiés. Stockage, données et fuseau relus après écriture sur r51 en RAM. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Les vues contextuelles et services indisponibles ne sont pas tous qualifiés. Java Android compilé, sans nouvel APK. Aucun flash, ticket fermé ni publication. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Navigation, accessibilité et aide corrigées. Les panneaux incomplets restent visibles. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Vérification](https://img.shields.io/badge/V%C3%A9rification-475569?style=flat-square) : Menus parcourus ; certaines actions dépendent encore du matériel ou de l’opérateur. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Stockage](https://img.shields.io/badge/Stockage-475569?style=flat-square) : Informations de stockage et téléchargements raccordés. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Stockage](https://img.shields.io/badge/Stockage-475569?style=flat-square) : Affichage de l’espace utilisé par Vulpes. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Données mobiles, itinérance, heure, réseaux Wi-Fi masqués et panneau Son corrigés. -## En développement — 12 octobre 2026 — Navigation des paramètres +## 12/10/2026 : Navigation des paramètres -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Listes déroulantes : sélecteur Gaia avec confirmation/annulation ; choix Clair/Sombre accessible. Gestionnaire SIM adapté à un emplacement. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Panneaux indisponibles : explication et commandes désactivées au lieu de liens sans effet. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : réseaux Wi-Fi mémorisés séparés des scans lents ; cache conservé lors des lectures d’état. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : informations SIM, centre SMS et accusés de réception reliés au modem. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) r45 en RAM : huit contrôles d’apparence, cinq panneaux et changement réel des accusés SMS validés, puis réglage restauré. Sélecteur PC vérifié ; ressources APK préparées. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Certificats Enterprise et autres options opérateur encore indisponibles. Aucun SMS émis, nouvel APK, flash ou publication. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Apparence](https://img.shields.io/badge/Apparence-475569?style=flat-square) : Choix Clair/Sombre et validation ou annulation des sélecteurs rétablis. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SIM](https://img.shields.io/badge/SIM-475569?style=flat-square) : Gestionnaire adapté aux téléphones à une seule SIM. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Informations SIM, centre de messagerie et accusés de réception. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Chargement plus rapide des réseaux enregistrés. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Certificats Wi-Fi, sécurité SIM et stockage USB encore incomplets. -## En développement — 12 octobre 2026 — Correctifs communs sur Pixel 3a +## 12/10/2026 : Apparence sur Pixel 3a -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : boot r39 en RAM avec correctifs partagés et premier mode sombre. Noyau et configuration matérielle du r35 conservés. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Démarrage, taille d’écran, réglages persistants, batterie, interface d’appel et Fira vérifiés. Services modem, audio, Wi-Fi et Bluetooth actifs. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sept contrôles d’apparence réussis dans Gaia : thème propagé, en-têtes lisibles, libellés placés et retour au clair. Capture Pixel inspectée. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Outil de mise à jour Gaia dans un boot privé, avec empreintes, sources conservées et vérification des composants matériels inchangés. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Aucun nouvel appel, SMS ou appairage testé. Thème complet et comportement Android encore à qualifier. Aucun nouvel APK, flash ou publication. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Apparence](https://img.shields.io/badge/Apparence-475569?style=flat-square) : Modes clair et sombre communs disponibles sur le Pixel 3a. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Correctifs des paramètres et polices Firefox OS intégrés. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Vérification](https://img.shields.io/badge/V%C3%A9rification-475569?style=flat-square) : Pas de nouvel essai des appels, SMS ou Bluetooth à cette étape. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Apparence](https://img.shields.io/badge/Apparence-475569?style=flat-square) : Thèmes et affichage vérifiés sur le téléphone. -## En développement — 11 octobre 2026 — Apparence et clavier partagé +## 11/10/2026 : Apparence et clavier -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Apparence : Clair, Sombre ou Selon le système, partagé entre les applications et conservé au redémarrage. Fonds d’écran, photos et sites externes préservés. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Clavier : opérations d’édition mutualisées, sélection et effacement, protection contre les réponses tardives. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : neuf contrôles d’apparence et gestes de saisie dans Messages réussis, sans envoi de SMS. Revue visuelle de Paramètres, Messages, Téléphone et Contacts. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Android : option expérimentale de clavier Gaia ; clavier Android conservé par défaut et mode de saisie restauré à la fermeture. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android : réessayer brièvement le même capteur encore occupé, sans réessayer après refus de permission ou fermeture de Photo. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Preview 19 construit localement : signature, alignement, parité et tests du pont/caméra réussis. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Clavier Gaia, caméra avant Android et thème complet encore à qualifier. Sources prêtes pour Sargo, resté sur r35 à cette étape. Aucun upload, flash ni ticket fermé. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Apparence](https://img.shields.io/badge/Apparence-475569?style=flat-square) : Modes Clair, Sombre et Système, conservés au redémarrage. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Clavier](https://img.shields.io/badge/Clavier-475569?style=flat-square) : Sélection et suppression de texte corrigées. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Thèmes et saisie de SMS vérifiés. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Clavier](https://img.shields.io/badge/Clavier-475569?style=flat-square) : Clavier Gaia expérimental ; le clavier Android reste proposé par défaut. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Nouvelle tentative possible quand la caméra est occupée. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Vérification](https://img.shields.io/badge/V%C3%A9rification-475569?style=flat-square) : Preview 19 construite ; thèmes, clavier et caméra avant encore à vérifier sur Android. -## En développement — 11 octobre 2026 — Paramètres et accueil +## 11/10/2026 : Paramètres et accueil -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Paramètres : gestion des sonneries, saisie/effacement du code PIN, désactivation du verrouillage et liste des permissions des applications tierces. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Accueil : première initialisation du second lanceur et aperçus des fonds d’écran. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Langues : actualiser les libellés Vulpes au changement de langue ; anglais de secours hors français. Fermer le panneau d’échec caméra et les bandeaux d’installation. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Android : ouvrir le volet Gaia en touchant la barre de statut. Preview 18 construit, signé et comparé aux sources. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : neuf parcours Gaia, cinq contrôles de bandeaux et douze tests activités/caméra réussis. Bluetooth Sargo r35 confirmé par l’utilisateur. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Redémarrage à chaud du compositeur encore instable : fichiers restaurés et retour à r35. Corrections non qualifiées sur Sargo à cette étape ; clavier/thème Android ouverts. Aucun APK publié ni flash. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Accueil](https://img.shields.io/badge/Accueil-475569?style=flat-square) : Second écran d’accueil, aperçus de fonds d’écran et bandeau d’installation corrigés. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Fermeture du message d’erreur rétablie. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Sonneries, code de verrouillage, permissions et libellés FR/EN corrigés. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Ouverture du volet en touchant la barre de statut. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Preview 18 construite localement. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Retour à la version précédente après un redémarrage instable de l’interface. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Fonctionnement confirmé par l’utilisateur. -## En développement — 9 octobre 2026 — MMS et Bluetooth +## 09/10/2026 : MMS et Bluetooth -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Bluetooth : adaptateur Gaia partagé, commandes matérielles séparées et accès limité aux applications autorisées. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : activation, découverte, appairage explicite, connexion et suppression depuis le panneau Bluetooth Gaia. Modules audio Bluetooth intégrés. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : services réseau Qualcomm et transport MMS raccordés. Une déconnexion D-Bus ne termine plus le daemon MMS. État persistant, reprise sans doublon ni renvoi automatique incertain. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) r35 en RAM : MMS avec image visible et accepté par le MMSC Orange ; réception destinataire à confirmer. Cinq appareils Bluetooth détectés, A2DP vers PC validé. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 191 tests Python Tundra et 18 tests JavaScript réussis. Ramdisk allégé et ressources Android synchronisées. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Audio d’appel via casque non qualifié. Aucun nouvel APK, flash ni push à cette étape. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Panneaux Gaia reliés aux capacités de chaque plateforme. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Recherche, association, connexion, oubli d’appareils et sortie audio. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Envoi conservé et repris après une interruption. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Vérification](https://img.shields.io/badge/V%C3%A9rification-475569?style=flat-square) : MMS accepté par l’opérateur, réception non confirmée. Audio d’appel sur casque à tester. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Lecture audio Bluetooth vers un PC vérifiée. -## En développement — 8 octobre 2026 — Caméra et transport MMS +## 08/10/2026 : Caméra et MMS -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Caméra : arrêter le flux avant de détacher la vidéo ; attendre la fermeture du capteur, réinitialiser le viseur et recalculer sa taille après rotation. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) MMS : préserver les pièces jointes Blob et garder les messages en attente jusqu’à confirmation du transport. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : viseur WebGL réutilisé sans recapture vidéo intermédiaire ; écran maintenu éveillé pendant l’aperçu. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC et Sargo : parcours Photo/Galerie et huit bascules natives vérifiés. JPEG, focus et zoom fonctionnels ; arrière ~16 FPS, avant ~25–27 FPS dans cet essai. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : file MMS persistante, codec Nuntium et transport oFono. Interface texte/photo testée avec transport simulé. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Données mobiles bloquantes pour les MMS opérateur à cette étape. Ressources Android synchronisées ; aucun nouvel APK, flash ou push. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Changement de capteur, arrêt et affichage après rotation corrigés. + +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Pièces jointes conservées et envoi affiché en attente jusqu’à confirmation. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Aperçu mesuré autour de 16 images/s à l’arrière et 25 à 27 à l’avant. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Envoi réel encore bloqué par la connexion aux données mobiles. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Mise au point, zoom et prise de photo vérifiés. -## 8 octobre 2026 — Rappel et messages d’erreur +## 08/10/2026 : Journal d’appel et dialogues -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Dialogues Gaia : texte visible au lieu d’un écran gris avec un bouton seul. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Journal d’appel : rappel via le même service que le pavé numérique, sans anciennes API Gecko. Fichier partagé PC/Android/Sargo. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) MMS : signaler clairement l’envoi indisponible, garder texte et pièces jointes, ne plus annoncer un faux mode avion. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : dialogues FR/EN et composeur préservé. Sargo en RAM : 11 contrôles Gaia réussis, rappel testé avec modem simulé. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Aucun appel réel ni validation audio dans cette étape. Ressources Android synchronisées, aucun nouvel APK publié. +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Messages d’erreur lisibles, avec des boutons utilisables. + +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Message clair si l’envoi est indisponible, sans perdre le brouillon. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Téléphone](https://img.shields.io/badge/T%C3%A9l%C3%A9phone-475569?style=flat-square) : Rappel depuis le journal d’appel rétabli. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Appels](https://img.shields.io/badge/Appels-475569?style=flat-square) : Parcours vérifié avec des appels simulés ; audio réel non testé. -## En développement — 8 octobre 2026 — SMS et audio +## 08/10/2026 : SMS et audio -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS : envoyer en un appui en conservant le clavier. Trombone raccordé au menu Gaia : image, audio, vidéo ou contact. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Interface : indicateur de volume visible, gestes du verrouillage et balayage des notifications corrigés. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : clavier, pièces jointes, Galerie, interface d’appel et volume vérifiés ; notification balayée sans déplacer la page. Aucun nouvel APK publié. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : accès à PulseAudio, relais Qualcomm, protocole D-Bus et périphériques de calibration rétablis. Service audio Android concurrent retiré. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : 11 contrôles Gaia, calibration et prévisualisations arrière/avant/arrière réussis. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Appels échouant avant sonnerie avec une erreur réseau dans cet essai. Audio bidirectionnel, geste Pixel et MMS encore non validés. Aucun flash ni publication. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Affichage du volume, verrouillage et balayage des notifications corrigés. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Envoi en un appui, sans fermer d’abord le clavier. Menu des pièces jointes rétabli. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Audio](https://img.shields.io/badge/Audio-475569?style=flat-square) : Corrections du routage du son des appels. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Appels](https://img.shields.io/badge/Appels-475569?style=flat-square) : Le réseau a empêché de vérifier une conversation réelle ; son dans les deux sens non confirmé. -## En développement — 8 octobre 2026 — Fiabilité téléphonie +## 08/10/2026 : Fiabilité du réseau -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : service radio maintenu après fermeture d’un client. Jamais de nouvel appel ou SMS automatique après une réponse perdue. Erreurs sans numéro ni texte du message. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Diagnostic réseau/audio sans identifiants personnels et paramètres opérateur épinglés dans l’image native. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS : attendre le vrai gestionnaire Gaia et accepter les identifiants oFono avec majuscules. Contrôle des conversations rétabli sans réémission. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : LTE retrouvé après redémarrage, SMS confirmé envoyé par le modem, microphone non silencieux et lecture audio acceptée. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Réception destinataire, audio d’appel bidirectionnel et stabilité modem restent à qualifier. Compositeur instable au redémarrage à chaud. Aucun nouvel APK, flash ou push. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Messages associés à la bonne conversation. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Récupération du modem améliorée ; les nouvelles tentatives évitent de doubler appels et SMS. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Appels](https://img.shields.io/badge/Appels-475569?style=flat-square) : Stabilité du réseau et audio dans les deux sens encore à confirmer. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Retour sur le réseau 4G après redémarrage du modem vérifié. -## 8 octobre 2026 — Mise à jour des sources publiques +## 08/10/2026 : Sources publiques -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Publication des correctifs Caméra, Contacts, SMS et Marketplace, et des outils Sargo de construction et de restauration. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) README français et anglais actualisés avec les fonctions et limites vérifiées. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Création du dossier de rapports lors du contrôle de parité Android sur un dépôt neuf. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Configuration Wi-Fi native vérifiée : aucun profil de connexion embarqué. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Documents internes, données personnelles et clés exclus du dépôt. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) APK public inchangé (Preview17) ; correctifs du 8 octobre non inclus. Aucune nouvelle image native publiée. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo : modem encore en recherche réseau ; audio des appels, appairage et profils Bluetooth à valider. +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Sources](https://img.shields.io/badge/Sources-475569?style=flat-square) : Publication des corrections caméra, contacts, SMS et Marketplace, avec présentations FR/EN à jour. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Construction](https://img.shields.io/badge/Construction-475569?style=flat-square) : Construction depuis une copie neuve du dépôt corrigée. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : L’APK public reste en Preview 17 ; ces corrections sont dans les sources. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Recherche de réseau encore instable à cette étape ; pas de nouvelle image publiée. -## 8 octobre 2026 — Caméra et parcours Contacts · en développement +## 08/10/2026 : Caméra et contacts -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Caméra : ouvertures successives, libération du capteur et identification avant/arrière corrigées. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Contacts : transport des photos et des dates corrigé sur PC, Android et Tundra. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Contacts : actualisation après modification, ouverture de SMS, sélection d’un numéro et préremplissage du pavé numérique rétablis. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Galerie : ouverture en mode sélection pour la photo d’un contact, même si l’application est déjà ouverte. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : fichiers Contacts corrigés inclus dans l’image de démarrage. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android : transmission du destinataire et du texte à l’application SMS, y compris les réponses et les numéros non encore validés. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Tests de caméra, stockage des contacts, permissions, transport binaire et activités. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : capture JPEG, Galerie, photo de contact, création, édition, recherche, favoris et suppression vérifiés. Aucun appel ni SMS émis. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo en RAM : autofocus, zoom, quatre bascules de caméra, capture et Galerie vérifiés ; parcours Contacts testés au toucher. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : conversations stockées, clavier et notifications vérifiés ; quatre réseaux Wi-Fi détectés. Nouveaux SMS et audio d’appel à valider. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : BlueZ et ses dépendances avec empreintes SHA256. Activation et recherche Bluetooth testées ; appairage et profils à valider. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : magasin de certificats natif. HTTPS, archives altérées, collisions de fichiers et reconstructions testés. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Preview17 publié avec téléchargement et SHA256 vérifiés. Les correctifs ci-dessus restent dans les sources ; essai SMS Android réel nécessaire. Aucun flash Sargo. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Ouverture et changement de capteur fiabilisés. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Contacts](https://img.shields.io/badge/Contacts-475569?style=flat-square) : Photos, dates, modifications et choix d’un numéro depuis SMS ou Téléphone corrigés. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Galerie](https://img.shields.io/badge/Galerie-475569?style=flat-square) : Sélection des médias corrigée. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Correctifs dans les sources ; APK public inchangé à cette étape. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Numéro et texte transmis correctement à l’application Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Recherche disponible ; association et usages audio encore à vérifier. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Photo, mise au point, zoom et changements de capteur vérifiés. -## 6 octobre 2026 — Thème Marketplace intégré · en développement +## 06/10/2026 : Thème Marketplace -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Marketplace : thème intégré avec Fira locale, navigation compacte, boutons tactiles, filtres repliables et captures défilantes. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Conservation de `mode=app` dans la navigation, la recherche, les filtres et le changement de langue. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) En-têtes du site masqués en mode intégré. Confirmations gérées par Gaia, sans privilèges supplémentaires pour le catalogue. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 16 pages FR/EN, 2 pages classiques et affichages mobiles à 320 et 360 pixels vérifiés. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Thème prêt localement, non déployé. Lanceurs PC et Sargo mis à jour ; intégration Android au prochain APK. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Intégration prévue dans un prochain APK. + +### ![Web](https://img.shields.io/badge/Web-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Thème intégré : police Fira, navigation compacte, boutons tactiles et captures défilantes. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Affichage intégré conservé pendant la recherche, les filtres et les changements de langue. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Thème préparé localement, pas encore déployé sur le site. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Affichage](https://img.shields.io/badge/Affichage-475569?style=flat-square) : Pages françaises et anglaises vérifiées sur petits écrans. -## 6 octobre 2026 — Bandeaux Gaia · en développement +## 06/10/2026 : Bandeaux de notification -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Fermeture automatique du bandeau « Application installée », même sans événement de fin d’animation. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Annulation des anciens délais lorsqu’un nouveau bandeau remplace le précédent. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : affichage, expiration, remplacement et fermeture au clic vérifiés. Sargo : disparition après cinq secondes vérifiée en RAM. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Correctif disponible dans les sources communes pour le prochain APK. Aucun flash ni publication. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Le bandeau « Application installée » disparaît automatiquement et se remplace correctement. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Affichage et fermeture des bandeaux vérifiés. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Correctif préparé pour le prochain APK. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Disparition du bandeau après cinq secondes vérifiée. -## 6 octobre 2026 — Wi-Fi et panneaux Paramètres · en développement +## 06/10/2026 : Wi-Fi et paramètres -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Paramètres : ouverture des panneaux même sans événement de fin d’animation, sans double initialisation. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : événements Wi-Fi corrigés pour rétablir l’affichage des réseaux et signaler correctement la déconnexion. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : quatre points d’accès détectés, regroupés en deux réseaux. Connexion confirmée et requête HTTPS réussie avec certificats vérifiés. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sources communes, serveur PC et essai Sargo en RAM mis à jour. Correctifs non inclus dans l’APK public. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Ouverture des panneaux rétablie quand une animation ne se termine pas normalement. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Correctifs encore absents de l’APK public. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Réseaux détectés et déconnexions affichés correctement. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Recherche, connexion et accès Internet vérifiés. -## 6 octobre 2026 — Marketplace · en développement +## 06/10/2026 : Navigation Marketplace -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) PC/Sargo : catalogue Marketplace contenu sous la barre de statut, masqué à l’accueil et retiré à la fermeture. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Une navigation annulée ou une ancienne page d’erreur ne masque plus la nouvelle tentative. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Message d’erreur local avec bouton Réessayer lorsque le catalogue est inaccessible. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : navigation, erreur réseau, nouvelle tentative, accueil et fermeture vérifiés. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo en RAM : sept contrôles réussis avec une page locale et déverrouillage forcé. Catalogue distant non validé sans connexion Internet. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview17 local reconstruit ; signature, alignement et ressources vérifiés. Aucun nouveau test sur appareil Android ni publication. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Message local avec bouton Réessayer si le catalogue est inaccessible. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Le catalogue reste sous la barre de statut et se masque en revenant à l’accueil ou en le fermant. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Navigation](https://img.shields.io/badge/Navigation-475569?style=flat-square) : Une ancienne erreur ne masque plus une nouvelle tentative. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Navigation, erreurs, retour à l’accueil et fermeture vérifiés. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Preview 17 reconstruite localement, sans nouveau test Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Interface testée avec une page locale ; catalogue distant non vérifié sans Internet. -## 2.7-preview.17 — APK construit · 5 octobre 2026 +## 05/10/2026 : 2.7-preview.17 -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Marketplace sur l’accueil, avec son icône originale et le catalogue Vulpes en français ou en anglais. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Installation confirmée des applications ZIP, lancement depuis l’accueil et désinstallation. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Applications installées isolées des sources Gaia et des privilèges système. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : parcours complet avec 2048 et contrôles des archives, chemins, limites, annulations et confirmations à usage unique. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview17 construit et signé avec Marketplace, GeckoView et stockage privé des paquets. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Émulateur Android 16/API 36 : installation, lancement, isolation, conservation après redémarrage de l’application et désinstallation de 2048. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo en RAM le 6 octobre : accueil et ressources Marketplace vérifiés, 9 contrôles système sur 10 réussis. Variation du viewport au déverrouillage ; installation de paquets à valider. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Prise en charge initiale des applications web empaquetées. Anciennes API privilégiées et applications hébergées non restaurées. Aucune publication à cette étape. +![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Installation, lancement et désinstallation d’applications web empaquetées. +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Catalogue Vulpes sur l’accueil, en français et en anglais, avec son icône originale. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Sécurité](https://img.shields.io/badge/S%C3%A9curit%C3%A9-475569?style=flat-square) : Applications installées séparées des applications système. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Compatibilité](https://img.shields.io/badge/Compatibilit%C3%A9-475569?style=flat-square) : Certaines anciennes applications et API Firefox OS ne sont pas encore prises en charge. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Installation et utilisation de 2048 vérifiées. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : 2048 installé, conservé après redémarrage et désinstallé sur un émulateur Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Accueil vérifié ; installation d’applications encore à valider sur le Pixel. -## 2.7-preview.16 — APK construit · 5 octobre 2026 +## 05/10/2026 : 2.7-preview.16 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sélecteurs Gaia de fond d’écran et de sons rétablis, avec retour vers Paramètres et annulation par Accueil. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Changement de langue appliqué à l’accueil et conservé après redémarrage. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Arrêt du balayage horizontal sur chaque page ; applications de développement masquées sur l’accueil. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Logo Vulpes au démarrage et liste des sons adaptée au moteur actuel. Transport des médias partagé entre PC et Android. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android : verrouillage Gaia après veille et retour depuis la caméra du verrouillage. Mode lanceur HOME validé. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Android : barres système masquées en mode immersif, accessibles par balayage. APK Preview16 construit et signé. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC et émulateur Android 16/API 36 : fonds d’écran, sons et panneaux vérifiés ; langue, verrouillage et persistance du fond testés sur Android. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : image de démarrage mise à jour pour ne plus restaurer d’anciens fichiers. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo en RAM : 6 contrôles d’interface et 10 contrôles système réussis. Installation conservée en Preview15, sans flash. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) APK non publié. Installation FFAA et audio d’appel à valider ; le choix d’un son Gaia ne change pas la sonnerie Android. +![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Logo Vulpes au démarrage. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Accueil](https://img.shields.io/badge/Accueil-475569?style=flat-square) : Défilement horizontal involontaire supprimé ; applications de test masquées. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Personnalisation](https://img.shields.io/badge/Personnalisation-475569?style=flat-square) : Choix des fonds d’écran et des sons rétabli. Langue appliquée à l’accueil et conservée au redémarrage. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : APK construit, non publié ; image Pixel essayée sans installation permanente. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Barres Android masquées, accessibles par balayage ; mode lanceur vérifié. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Verrouillage](https://img.shields.io/badge/Verrouillage-475569?style=flat-square) : Retour après veille et depuis la caméra du verrouillage corrigé. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Les anciens fichiers ne remplacent plus les mises à jour au démarrage. -## En développement — 4 octobre 2026 — Installation autonome Sargo +## 04/10/2026 : Installation autonome -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : volume ext4 autonome pour userdata, avec système, données et composants vendor/modem. Installation indépendante de Droidian et d’ADB. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Installateur Fastboot avec contrôles du modèle, du déverrouillage, des tailles et des empreintes. Remplacement de userdata, dtbo_a, vbmeta_a et boot_a ; calibrations conservées. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sauvegarde complète de userdata et archive de restauration vérifiées avant le flash. Restauration réelle non testée. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Deux démarrages installés réussis : 11 contrôles Gaia et 10 contrôles natifs par démarrage, réglages conservés et boot relu conforme. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Variante sans SSH ni clés de maintenance démarrée après flash. Variante de développement réinstallée ; caméra, clavier et notifications vérifiés. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Paquet Fastboot local assemblé ; 44 tests ciblés réussis. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Paquet non publié : provenance et redistribution de composants matériels à finaliser. Essais sur un seul Pixel 3a ; volume de 8 Gio dont 1 Gio modifiable, sans extension automatique. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Installateur avec vérification du modèle et des fichiers avant écriture. +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Installation autonome de Vulpes, sans passer par Droidian. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Paquet non publié ; un seul Pixel testé. L’installation remplace les données du téléphone. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Secours](https://img.shields.io/badge/Secours-475569?style=flat-square) : Sauvegardes vérifiées ; restauration complète encore à essayer. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Démarrages installés, conservation des réglages, caméra, clavier et notifications vérifiés. -## En développement — 3 octobre 2026 — Installation Sargo par appareil +## 03/10/2026 : Installation par appareil -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : dossier appareil portable pour les builds, l’installation et le secours, indépendant de l’inventaire du Pixel de développement. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Collecte en lecture seule des six partitions de démarrage et du stockage, liée à l’identité du téléphone. Sauvegardes privées. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Transfert SSH avec contrôle d’identité, du stockage et des empreintes, sans écrasement, formatage ni flash. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Deux boots RAM : 11 contrôles Gaia et 10 contrôles natifs réussis chacun ; réglage conservé. Timeout autofocus au premier essai, caméra fonctionnelle au second. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Retour au build installé vérifié ; boot inchangé et écrasement des données refusé. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Timeout autofocus non déclaré corrigé. Provenance exacte du HAL encore à établir ; noyau et stockage ext4/LVM compatibles requis, sans installation directe depuis Android d’origine. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Préparation adaptée à chaque Pixel, avec sauvegardes propres à l’appareil. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Mise au point parfois trop lente ; problème encore ouvert. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Installation directe depuis Android d’origine pas encore disponible. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Démarrages temporaires, conservation des réglages et retour à l’installation précédente vérifiés. -## En développement — 3 octobre 2026 — Préparation et secours Sargo +## 03/10/2026 : Installation et secours -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : préparation locale des paquets avec contrôles d’empreintes, décompression bornée, vérification ext4 et création de données vierges sans écrasement. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Kit de secours privé avec sauvegarde de boot_a et contrôles du modèle, du numéro de série, du slot et des empreintes. Données utilisateur non incluses. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Restauration possible sans l’image de diagnostic. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Construction système : référence matérielle ARM64 complète exigée. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Archive système préparée et kit de secours vérifié localement. Installation sur un autre Sargo à finaliser ; aucun flash ni ROM publiée. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Journal JSON inclus dans les prochaines publications de sources ; documents de travail exclus. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Préparation des paquets et kit de secours avec sauvegarde du démarrage. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Secours](https://img.shields.io/badge/Secours-475569?style=flat-square) : Restauration possible sans démarrer l’outil de diagnostic. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Préparation vérifiée localement ; installation sur un autre Pixel encore à finaliser. + +### ![Web](https://img.shields.io/badge/Web-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Changelog](https://img.shields.io/badge/Changelog-475569?style=flat-square) : Historique commun inclus dans les prochaines publications de sources. -## En développement — 3 octobre 2026 — Sargo : récupération modem et installation vierge +## 03/10/2026 : Modem et premier démarrage -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : cache des polices et création du dossier privé oFono au premier démarrage corrigés dans l’image système. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Récupération du modem sans redémarrer le téléphone. Réenregistrement réseau mesuré à environ 22 secondes lors d’un essai contrôlé. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Profil neuf : Gaia, rendu matériel, Fira, deux caméras, focus, zoom, clavier et notifications vérifiés. Scan Wi-Fi fonctionnel après redémarrage du modem. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Deux démarrages avec conservation des réglages dans un espace de données séparé. Installation existante préservée. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Cause du watchdog IMS non corrigée. Paquet public d’installation et de restauration encore incomplet ; aucune image publiée. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Récupération du modem sans redémarrer tout le téléphone. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Polices et initialisation du modem corrigées sur une installation neuve. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Redémarrages intermittents du modem encore à résoudre ; paquet public incomplet. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Caméras, focus, zoom, clavier, notifications et recherche Wi-Fi vérifiés. -## 1er octobre 2026 — Sargo : préparation de la distribution — en développement +## 01/10/2026 : Préparation de la distribution -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : image Preview15 reconstruite avec profils vierges, licences et inventaire des 493 paquets. Documents de travail exclus. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Table de montage générée depuis l’inventaire du stockage. Prise en charge limitée à une seule étendue ext4 sur userdata. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Droits du cache des polices au premier démarrage : fc-cache exécuté avec le compte de session. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Contrôles ext4, contenu et transfert réussis. Essais RAM sans écriture de boot_a ; retour au build v59 vérifié. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) SIM, LTE, scan Wi-Fi, Gaia, rendu matériel, Fira, caméras, clavier et notifications vérifiés en RAM. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Récupération ciblée après identification d’un redémarrage intermittent du firmware IMS. Second démarrage réussi ; nouveau crash IMS non testé. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Qualification de l’image incomplète, sans validation des appels, SMS ou données mobiles de bout en bout. Image non publiée et non flashable. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Préparation d’une image avec des données vierges. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Polices](https://img.shields.io/badge/Polices-475569?style=flat-square) : Affichage des polices au premier démarrage corrigé. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Image non publiée. Appels, SMS et données mobiles encore à vérifier de bout en bout. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Redémarrage intermittent du modem identifié. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : SIM, 4G, recherche Wi-Fi, caméras, clavier et notifications vérifiés en démarrage temporaire. -## 2.7-preview.15 — 30 septembre 2026 — publiée +## 30/09/2026 : 2.7-preview.15 -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Première publication des sources PC, Android et Tundra, avec README FR/EN, licences et scripts de préparation. Fichiers privés exclus. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS : dates des bulles et états d’envoi/échec corrigés. Libération et remplacement des flux caméra fiabilisés. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) PC : tests de navigation stabilisés, délai de démarrage à froid ajusté et fermeture propre après dépassement du délai Gaia. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC avec Gecko 156.0.1 : 42 tests de services, démarrage, navigation, réglages, gestes, historique, isolation et persistance vérifiés. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview15 signé avec la clé précédente et GeckoView 156.0 ; parité des ressources vérifiée. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Émulateur Android 16 : mise à jour, Photo/Galerie, reprise caméra, dix retours d’arrière-plan et récupération du rendu validés. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo : sources incluses, build privé v59 conservé. Aucune ROM générique ; démarrage lié au stockage et aux images préinstallées. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo : aperçu proche de 16 i/s ; flash, vidéo, rotation et veille profonde incomplets. Audio d’appel et dialogue après envoi SMS à examiner. +![Publié](https://img.shields.io/badge/Publi%C3%A9-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Sources](https://img.shields.io/badge/Sources-475569?style=flat-square) : Première publication des sources PC, Android et Tundra, avec présentation FR/EN. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Arrêt et remplacement du flux caméra fiabilisés. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Dates et états d’envoi corrigés dans les conversations. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Navigation, réglages, gestes et conservation des données vérifiés. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Mise à jour, Photo, Galerie et retours d’arrière-plan vérifiés sur un émulateur Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Sources incluses ; installation universelle encore indisponible à cette étape. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Flash, vidéo, rotation, veille et audio d’appel encore incomplets ou à vérifier. [Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.15) -## En développement — retours SMS et caméra · 30 septembre 2026 +## 30/09/2026 : Retours SMS et caméra -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS : conversion des dates pour corriger les conversations vides. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Caméra : fermeture des flux et libération du capteur corrigées ; une ancienne session ne peut plus fermer la suivante. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : arrêt physique du vibreur via DRV2624, avec coupure de secours au démarrage et à l’arrêt du service. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : composition et affichage des SMS vérifiés avec modem simulé. Sargo : bascules caméra et arrêt du capteur testés sur deux boots RAM. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v54 : focus, zoom et SMS dans les deux sens confirmés par l’utilisateur. Cinq conversations affichées ; arrêt du vibreur confirmé. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo v59 installé sur boot_a après deux boots RAM ; démarrage, relecture et slot A vérifiés. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Dialogue après envoi SMS et fluidité caméra encore à traiter. Sources communes mises à jour, sans nouvel APK. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Libération du capteur et changement de caméra corrigés. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Conversations vides corrigées. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Sources communes mises à jour, sans nouvel APK. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Arrêt du vibreur rétabli. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![À suivre](https://img.shields.io/badge/%C3%80%20suivre-475569?style=flat-square) : Dialogue après envoi SMS et fluidité caméra encore à corriger. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Focus et zoom confirmés par l’utilisateur. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Envoi et réception confirmés par l’utilisateur ; conversations affichées. -## En développement — SMS et Photo · 30 septembre 2026 +## 30/09/2026 : SMS et photo -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) PC/Tundra : conservation des SMS après refus du modem et transmission des états envoi, échec et envoyé à Gaia. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : états SMS persistants après disparition de l’objet oFono ; envoi refusé si le modem n’est pas enregistré. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : focus tactile, zoom numérique et capture JPEG du capteur dans Photo Gaia. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Photos mesurées : 4032 × 3024 à l’arrière, 3264 × 2448 à l’avant. Aperçu 640 × 480 ; focus avant fixe. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Caméra native : données binaires séparées des traces HAL, réponses bornées et reprise de l’aperçu après capture ou erreur de focus. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : échec d’envoi visible et parcours Photo/Galerie vérifiés. Sargo v54 : deux boots RAM puis installation, persistance et caméra validées. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Réseau instable ; aucune livraison SMS de bout en bout confirmée dans cette passe. Confirmation modem distincte de l’accusé de réception. APK public inchangé (Preview14). +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Messages en échec conservés et états d’envoi mis à jour. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : APK Preview 14 inchangé à cette étape. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Mise au point au toucher et zoom numérique. Photos jusqu’à 12 Mpx à l’arrière et 8 Mpx à l’avant. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Retour de l’aperçu après une photo corrigé. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Réception par le destinataire non encore confirmée. -## 2.7-preview.14 — APK publié · 30 septembre 2026 +## 30/09/2026 : 2.7-preview.14 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Informations système : alignement des versions et polices Fira dans les composants Shadow DOM. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) PC/Tundra : taille des touches en portrait, curseur dans le champ actif et réponses de saisie obsolètes. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) PC/Tundra : pont clavier Gaia et pavé numérique pour les destinataires SMS. Clavier Android inchangé. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Verrouillage : redimensionnement sans fenêtre clavier. Notifications silencieuses respectées, y compris après restauration. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : notifications persistantes dans le volet et sur le verrouillage, avec ouverture de l’application concernée. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : vibrations annulables, limitées à dix secondes ; profils Wi-Fi privés persistants, reconnexion automatique et oubli du réseau. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : stockage des SMS entrants avant acquittement, dédoublonnage et création du dossier d’état. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : commandes écouteur/haut-parleur, micro muet et volume d’appel. Bascule, sourdine et volume testés hors appel. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Installation : flash des images de diagnostic avec débogueur refusé. Sargo v48 installé après deux boots RAM ; persistance, relecture et slot A vérifiés. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : Calendrier et clavier vérifiés. Sargo : clavier, notifications et reconnexion Wi-Fi vérifiés ; son des notifications et téléphonie réelle à valider. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview14 signé et publié. Démarrage, versions et polices vérifiés sur émulateur Android 16. Aucune image Sargo publiée. +![Publié](https://img.shields.io/badge/Publi%C3%A9-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Polices, informations de version, verrouillage et notifications harmonisés. + +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Clavier](https://img.shields.io/badge/Clavier-475569?style=flat-square) : Clavier agrandi, édition de texte et saisie du numéro de destinataire améliorées. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Démarrage et polices vérifiés sur un émulateur Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Arrêt de la vibration corrigé. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Notifications conservées, ouverture de la conversation et doublons corrigés. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Réseaux enregistrés, reconnexion et oubli d’un réseau corrigés. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Audio](https://img.shields.io/badge/Audio-475569?style=flat-square) : Contrôles audio testés hors appel ; conversation et son des notifications encore à vérifier. [Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.14) -## 2.7-preview.13 — parcours dans les applications · 27 septembre 2026 +## 27/09/2026 : 2.7-preview.13 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Calendrier : sauvegarde des événements avec alarme, remontée des erreurs et exclusion des rappels d’événements supprimés. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Notifications : texte vide accepté ; notification refusée non marquée comme livrée. Support natif Tundra encore incomplet. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Galerie : taille des vignettes au démarrage masqué et arrêt des mises à jour après fermeture de l’éditeur. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS : filtres par correspondant, lecture, période et livraison appliqués. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : vidéo WebM, édition et copie de photo, calendrier, lecture et suppression des conversations vérifiés. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Copie isolée : démarrage, tests PC, persistance et empaquetage Android réussis. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview13 construit et signé. Photo/Galerie, Calendrier, dix reprises d’arrière-plan et récupération du rendu validés sur Android 16 émulé. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v40 installé après deux boots RAM ; Gaia, caméra, Wi-Fi, luminosité, commandes et relecture de boot_a vérifiés. +![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Calendrier](https://img.shields.io/badge/Calendrier-475569?style=flat-square) : Rappels des événements corrigés, y compris après suppression. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Galerie](https://img.shields.io/badge/Galerie-475569?style=flat-square) : Premier affichage et fermeture de l’éditeur corrigés. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Filtres des conversations corrigés. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Photo, vidéo, calendrier et conversations vérifiés. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Caméra, Galerie, Calendrier et reprise après arrière-plan vérifiés. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Caméra, Wi-Fi et luminosité vérifiés sur la version installée. -## 2.7-preview.12 — revue des applications · 27 septembre 2026 +## 27/09/2026 : 2.7-preview.12 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Icônes Gaia : variantes de 1× à 2,25× restaurées dans 1 047 références CSS. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Photo : changement de capteur après détection et désactivation du zoom de l’interface au pincement. Flash indisponible grisé. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Accueil : appui long et transmission des gestes rétablis, sans privilèges supplémentaires pour les sites web. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Navigateur : page d’accueil locale bilingue, suivant la langue Gaia sans redémarrage. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS : identifiants, migration, dates, événements d’envoi, requêtes multi-destinataires et écritures concurrentes corrigés. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Calendrier : libellé d’accessibilité du jour courant rétabli dans 37 langues. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Revue de 14 applications ; 26 contrôles Galerie/Musique/Horloge/UI, tests Contacts/SMS et isolation web. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview12 reconstruit avec les mêmes ressources ; parité vérifiée. Fonctions matérielles adaptées séparément sur Android et Tundra. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : aperçu caméra NV21 par shader et transport binaire, environ 23 i/s mesurées contre 8 dans l’essai intermédiaire. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : fermeture du worker caméra attendue avant changement de capteur ; luminosité manuelle réglée en environ 200 ms. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : activation Wi-Fi depuis Gaia et connexion WPA-PSK aux réseaux mixtes WPA2/WPA3. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : scan, connexion et HTTPS validés en RAM. v38 installé après deux boots RAM, relecture et slot A vérifiés. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo : profils Wi-Fi temporaires ; flash, vidéo, capteurs, Bluetooth, comptage de données et appels avancés incomplets. +![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Navigateur](https://img.shields.io/badge/Navigateur-475569?style=flat-square) : Page d’accueil locale, en français ou en anglais selon la langue. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Conversations SMS et traductions du Calendrier corrigées. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Changement de capteur et zoom de l’interface corrigés ; flash grisé s’il est indisponible. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Icônes plus nettes, appui long sur Accueil et gestes corrigés. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Aperçu plus fluide, autour de 23 images par seconde lors des essais. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Luminosité plus réactive et connexion Wi-Fi corrigée. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Vidéo, flash, Bluetooth et réglages d’appel avancés encore incomplets. -## En développement — retours Sargo et interface · 27 septembre 2026 +## 27/09/2026 : Interface et matériel -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Animation d’arrêt Gaia recolorée en bleu. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Téléphone : en-têtes fixes au changement d’onglet et icônes du journal adaptées aux densités jusqu’à 2,25×. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Texte coupé dans les menus déroulants et débordement du texte d’accueil Vidéo. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Luminosité : valeurs numériques et regroupement des commandes obsolètes, avec ordre veille/réveil préservé. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Accueil : fond sous le dégradé et bouton à droite en paysage, sans recouvrir les applications. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Navigateur : page d’accueil locale modifiable, avec mode privé conservé. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wi-Fi : message d’erreur et bouton Réessayer à la place des relances sans fin. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) APK Preview11 construit et signé ; rotation et position du bouton Accueil vérifiées sur Android 16 émulé. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : aperçu, JPEG et bascules caméra validés en RAM. Capture limitée à 640 × 480 ; flash et vidéo indisponibles. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v33 installé après deux boots RAM ; démarrage, données, relecture et slot A vérifiés. Luminosité et résultats Wi-Fi contrôlés dans Gaia. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : compatibilité PulseAudio 14 et suppression du double chargement des modules audio. Profils appel/média et écouteur testés. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo : conversation audio, capture pleine résolution, vidéo et rotation automatique à valider. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Navigateur](https://img.shields.io/badge/Navigateur-475569?style=flat-square) : Première page d’accueil locale. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Extinction](https://img.shields.io/badge/Extinction-475569?style=flat-square) : Animation d’extinction conservée, avec des ronds bleus. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Textes des listes et de Vidéo corrigés ; barre Accueil transparente et adaptée au paysage. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Téléphone](https://img.shields.io/badge/T%C3%A9l%C3%A9phone-475569?style=flat-square) : En-têtes et icônes du journal d’appel corrigés. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Luminosité](https://img.shields.io/badge/Luminosit%C3%A9-475569?style=flat-square) : Réglage de la luminosité raccordé. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Appels audio, vidéo, pleine résolution photo et rotation encore à vérifier. -## En développement — stabilité Wi-Fi native · 27 septembre 2026 +## 27/09/2026 : Stabilité Wi-Fi -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wi-Fi : intervalle de recherche rétabli à 20 secondes et regroupement des scans simultanés. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : un seul scan matériel à la fois, avec cache court et invalidation à la connexion/déconnexion. Corrige l’épuisement mémoire des builds v21/v22. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Tests de rafales, erreurs et temporisation Wi-Fi. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Version commune Preview9, Gaia 2.7.0 ; nouvel APK avec les mêmes sources. Wi-Fi Android toujours géré par Android. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v25 : deux boots RAM puis installation, 11 contrôles Gaia et 10 système réussis, sans arrêt de processus par manque de mémoire. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Verrouillage, polices, batterie, date et Wi-Fi vérifiés ; veille/réveil et volume testés par événements injectés. Données, relecture et slot A contrôlés. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Caméra native et validation complète des appels encore à terminer. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Preview 9 construite avec les corrections communes ; Wi-Fi géré par Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Recherche des réseaux stabilisée pour éviter les blocages du téléphone. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Caméra et appels encore incomplets. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Verrouillage, polices, date, batterie et Wi-Fi vérifiés. -## En développement — restauration Gaia · 27 septembre 2026 +## 27/09/2026 : Retour aux composants Gaia -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Panneaux Gaia restaurés : Paramètres, Suivi conso, FM et imports. Interfaces provisoires retirées ; fonctions indisponibles désactivées. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Styles des anciens composants, icônes du verrouillage et glyphes Téléphone corrigés. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Espace de 44 pixels réservé au bouton Accueil ; date et batterie rétablies, sans texte `{{ level }}`. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Verrouillage Gaia réactivé, splash stabilisé, nom Navigateur/Browser localisé et crédits ajoutés. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : 26 contrôles applicatifs réussis, plus panneaux, imports, batterie, navigation et appels simulés. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview8 installé sur Android 16 émulé : batterie Android, accès aux paramètres et mode HOME optionnel. Catalogue Android encore incomplet. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Android émulé : dix reprises d’arrière-plan, récupération du rendu et parité des ressources vérifiées. Verrouillage Gaia distinct de la sécurité Android. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo v21/v22 : scan et association Wi-Fi raccordés à Gaia via NetworkManager. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : essais RAM interrompus par l’arrêt du service graphique (code 139). Retour au v20 installé vérifié, sans nouveau flash. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Wi-Fi du candidat, caméra, API SIM/Bluetooth et suspension CPU non validés. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![À propos](https://img.shields.io/badge/%C3%80%20propos-475569?style=flat-square) : Remerciements, écran de démarrage et nom du navigateur mis à jour. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Panneaux et styles Gaia d’origine rétablis dans Paramètres, Suivi conso, Radio FM et les imports. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Bouton Accueil dégagé des commandes ; date, batterie et écran de verrouillage rétablis. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Intégration](https://img.shields.io/badge/Int%C3%A9gration-475569?style=flat-square) : Mode lanceur, accès aux paramètres Android et reprise après arrière-plan. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Première intégration instable ; retour à la version précédente. -## En développement — 27 septembre 2026 +## 27/09/2026 : Appels et boutons physiques -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Callscreen Gaia pour les appels entrants/sortants, avec réponse et raccrochage. Remplace l’écran provisoire v13. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Journal d’appels persistant avec acquittement et dédoublonnage. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Batterie inconnue distincte d’une batterie vide ; index Contacts absent ou mal formé toléré. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Textes système affichés avec Fira Sans, sans modifier les polices d’icônes. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC avec modem simulé : appels, raccrochage en échec puis nouvel essai, journal, veille/réveil, menu Power, volume et batterie. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : boutons Power/Volume raccordés à Gaia et commandes natives d’écran, volume, arrêt et redémarrage. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : luminosité et alimentation sérialisées pour éviter l’écran noir au réveil ; accès PulseAudio corrigé pour le volume. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : un raccrochage réussi avec réponse D-Bus vide ne produit plus de fausse erreur. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v13 puis v20 installés après essais RAM ; démarrage, relecture, réglages et validation du slot contrôlés. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Appel sortant réel arrivé à la sonnerie puis raccroché. Appels entrants et audio de conversation non validés. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Diagnostic caméra : un timeout n’est plus présenté comme une initialisation réussie. Deux capteurs détectés, sans trames reçues. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Caméra native indisponible, suspension CPU et commandes audio avancées incomplètes. Aucun nouvel APK. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Téléphone](https://img.shields.io/badge/T%C3%A9l%C3%A9phone-475569?style=flat-square) : Interfaces Gaia d’appel entrant et sortant, avec journal d’appel. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Polices Fira, contacts et affichage de la batterie corrigés. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Boutons](https://img.shields.io/badge/Boutons-475569?style=flat-square) : Prise en charge des touches Marche/Arrêt et Volume, du menu d’extinction et du réveil de l’écran. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Caméra native encore indisponible. +- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Appels](https://img.shields.io/badge/Appels-475569?style=flat-square) : Sonnerie et raccrochage vérifiés ; conversation audio encore à tester. -## En développement — 26 septembre 2026 +## 26/09/2026 : Démarrage et polices -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Polices Fira Sans historiques utilisées dans Gaia et Tundra ; repli sans-serif et contrôle Fontconfig corrigés. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Boutons de diagnostic retirés des Paramètres. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Panneau matériel : capacités de la plateforme transmises correctement pour afficher la batterie. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : erreurs modem et transport distinguées ; message caméra indisponible corrigé. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : données persistantes sur ext4 2 Gio et validation du succès A/B après installation. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v8 : deux boots avec persistance, 9 contrôles Gaia et 9 système par boot. Outils d’installation et de secours testés localement. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v9 installé sur boot_a : deux démarrages avec 10 contrôles Gaia et 9 système chacun. Relecture conforme, cinq autres partitions préservées ; restauration réelle non testée. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Démarrage normal sans gestes de diagnostic automatiques ; plein écran établi avant Gaia, dimensions stables à 360 × 740 pixels CSS. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Mode `--diagnostics` séparé ; images de diagnostic exclues du lancement normal. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : v13 testé en RAM (8 contrôles de démarrage, 9 système), v14 en diagnostic (13 contrôles interactifs), Wi-Fi inclus. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Enregistrement UMTS, lecture audio et signal du micro vérifiés. Audio d’appel, caméra et veille non validés. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Construction du ramdisk indépendante de la langue du PC grâce à readelf en locale C. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Essais privés, sans ROM publique. Sources PC synchronisées ; correctif commun disponible pour Android, sans nouvel APK. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Polices Fira et informations de batterie corrigées ; boutons de test retirés des paramètres. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Conservation des données lors du démarrage installé. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Plein écran stable, sans gestes ni ouverture automatique d’applications. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Son et micro testés séparément ; audio d’appel, caméra et veille non validés. -## En développement — 25 septembre 2026 +## 25/09/2026 : Accueil et premiers essais natifs -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Bouton Accueil rond, dégradé transparent sur le fond d’écran et barre bleue dans les applications. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Dégradé masqué en bas de page et rétabli au défilement ; plus de rectangle bleu à l’appui sur Accueil. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Fira Sans embarquée avec graisses et italiques ; versions produit, Gaia, moteur et plateforme affichées séparément. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Reprise du chargement des icônes après une première mesure de taille nulle sur les trois plateformes. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : icônes, navigation, permissions et panneau Informations FR/EN vérifiés avec Gecko 156.0.1. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android : état de navigation conservé après recréation de l’activité. Compilation Java réussie ; rendu à retester, aucun nouvel APK livré. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Tundra : image ext4 avec runtime ARM64, HAL, Phoc, Gecko et Gaia ; petits correctifs embarqués dans le ramdisk. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : backend dédié, informations Pixel 3a et lecture matérielle de la batterie. Sources de construction archivées avec empreintes. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : WebRender matériel, icônes et polices contrôlés sur capture physique. v5 : 10 contrôles Gaia et 8 système réussis. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : ajout de pd-mapper, désactivation d’IPA non initialisé et du sondage caméra prématuré. Données NV du modem copiées en RAM pour les essais. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v6 : scan Wi-Fi, connexion, IPv4, DNS et HTTPS vérifiés ; 13 contrôles Gaia et 9 système réussis. Sélection du réseau dans Gaia encore à raccorder. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Essais RAM sans flash, retour automatique après dix minutes et modifications perdues à l’arrêt. Démarrage à froid réussi ; redémarrage à chaud du compositeur en échec. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Pas de ROM publique ; modem, audio, caméra et veille encore à intégrer ou valider. +![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square) + +### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Accueil](https://img.shields.io/badge/Accueil-475569?style=flat-square) : Bouton rond, fond transparent sur l’accueil et bleu dans les applications. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : État appuyé du bouton, dégradé, polices et informations système corrigés. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Reprise de l’application modifiée dans les sources, pas encore testée sur Android. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Premiers essais d’une image native avec affichage accéléré et batterie. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Essais temporaires ; de nombreuses fonctions matérielles restent à raccorder. -## 2.7-preview.7 — APK construit, référence locale +## 2.7-preview.7 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Permission caméra sur PC et reprise après la première autorisation Android. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Messages distincts pour une permission refusée, un capteur absent et un échec d’ouverture. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Versions produit et moteur séparées : Vulpes Preview7, Gaia 2.7.0, Gecko PC 156.0.1 et GeckoView Android 156.0. +![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square) + +### ![Desktop + Android](https://img.shields.io/badge/Desktop%20%2B%20Android-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![À propos](https://img.shields.io/badge/%C3%80%20propos-475569?style=flat-square) : Versions de Vulpes, Gaia et Gecko distinguées. + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Gestion des autorisations et messages d’erreur plus précis. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Reprise après la première demande d’autorisation corrigée. -## 2.7-preview.6 — APK construit +## 2.7-preview.6 -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Photo Gaia sur PC et Android : aperçu et capture JPEG via webcam ou GeckoView. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Enregistrement dans Galerie et import par le sélecteur du système. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Flash et vidéo désactivés ; changement de caméra selon les capteurs disponibles. +![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square) + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Application Photo Gaia reliée à la webcam. +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Galerie](https://img.shields.io/badge/Galerie-475569?style=flat-square) : Import de fichiers et photos disponibles dans Galerie. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Changement de capteur selon le matériel ; flash et vidéo indisponibles. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Application Photo Gaia reliée aux caméras Android. +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Galerie](https://img.shields.io/badge/Galerie-475569?style=flat-square) : Import de fichiers et photos disponibles dans Galerie. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Changement de capteur selon le matériel ; flash et vidéo indisponibles. -## 2.7-preview.5 — APK construit +## 2.7-preview.5 -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Versions centralisées dans `release.json` ; produit, Gaia et moteur séparés. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Interface native commune PC/Android et contrôle de parité des ressources de l’APK. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) PC : réglages Linux, imports médias/vCard, notifications et capture webcam de test. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Android : retour au premier plan et récupération après arrêt du processus de rendu. +![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square) + +### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Intégration](https://img.shields.io/badge/Int%C3%A9gration-475569?style=flat-square) : Réglages système, imports de médias et de contacts, notifications et essai webcam. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Interface et numérotation des versions alignées avec Android. + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Interface et numérotation des versions alignées avec le PC. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Reprise après arrière-plan et récupération de l’affichage améliorées. -## 2.7-156.0.2 — APK historique construit (révision 4) +## 2.7-156.0.2 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android : reprise de l’activité et des sessions pour réduire les écrans blancs. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Accès aux réglages Android, volume et luminosité de la fenêtre. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Import de médias et contacts ; notifications natives avec permissions. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Transfert vers Téléphone, SMS, Horloge et Appareil photo Android. Aucun envoi silencieux ni remplacement des applications par défaut. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Numérotation historique : moteur Android Gecko 156.0, malgré le nom 2.7-156.0.2. +![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square) + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Intégration](https://img.shields.io/badge/Int%C3%A9gration-475569?style=flat-square) : Réglages Android, son, luminosité, imports et notifications. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Appels, SMS, horloge et caméra confiés aux applications Android. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Écrans blancs et reprise après arrière-plan corrigés. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Version](https://img.shields.io/badge/Version-475569?style=flat-square) : Ancienne numérotation : ce numéro ne correspond pas à une mise à jour de Gecko. -## 2.7-156.0.1 — APK publié (révision 3) +## 2.7-156.0.1 -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Nom « Vulpes OS - Preview » et icône du projet. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Clignotement du fond d’écran corrigé. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Numérotation historique, distincte de la version du moteur Android. +![Publié](https://img.shields.io/badge/Publi%C3%A9-334155?style=flat-square) + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Identité](https://img.shields.io/badge/Identit%C3%A9-475569?style=flat-square) : Nom « Vulpes OS – Preview » et icône du projet. +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Accueil](https://img.shields.io/badge/Accueil-475569?style=flat-square) : Clignotement du fond d’écran corrigé. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Version](https://img.shields.io/badge/Version-475569?style=flat-square) : Ancienne numérotation, conservée pour retrouver cette publication. [Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-156.0.1) -## 2.7-preview.2 — APK publié +## 2.7-preview.2 -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Clignotement du fond d’écran dans la Preview Android. +![Publié](https://img.shields.io/badge/Publi%C3%A9-334155?style=flat-square) + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Accueil](https://img.shields.io/badge/Accueil-475569?style=flat-square) : Clignotement du fond d’écran corrigé. [Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.2) -## 2.7-preview.1 — APK publié +## 2.7-preview.1 -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Première Preview Android avec Gaia et GeckoView. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Version archivée ; clignotement du fond d’écran connu. +![Publié](https://img.shields.io/badge/Publi%C3%A9-334155?style=flat-square) + +### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Découverte](https://img.shields.io/badge/D%C3%A9couverte-475569?style=flat-square) : Première Preview Android pour découvrir Vulpes sans flasher le téléphone. +- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Accueil](https://img.shields.io/badge/Accueil-475569?style=flat-square) : Fond d’écran clignotant connu dans cette première version. [Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.1) -## Étapes antérieures — rétrospective technique +## Premières étapes -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Base Gaia historique avec identité Vulpes, fond d’écran, traductions et informations système. -- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Portage expérimental Gecko 45 vers 52, puis séparation de Gaia, des services et du moteur. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) API de réglages, applications, contacts, messages, alarmes, stockage et communications entre applications. -- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Adaptation des composants Gaia, gestes tactiles, navigateur et applications aux moteurs récents. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Mise à jour Gecko avec contrôles et retour arrière ; mise à jour Gaia sans recompilation du moteur. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Applications Firefox OS archivées, QEMU, puis Gecko ARM64 dans Droidian et sous compositeur dédié. -- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : inventaire, sauvegardes de boot, racine distincte, services HAL et PID 1 Tundra. -- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Essais graphiques Fastboot temporaires avec secours SSH et retour automatique. -- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Noyau 4.9-124-google-sargo, adaptation Android 9/API 28. Étapes historiques, sans nouvelles releases datées. +### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Adaptation des contacts, messages, paramètres, alarmes et du stockage. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Identité](https://img.shields.io/badge/Identit%C3%A9-475569?style=flat-square) : Création de Vulpes : identité visuelle, traductions et informations système. +- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Moteur](https://img.shields.io/badge/Moteur-475569?style=flat-square) : Passage des anciens moteurs Firefox OS à un Gecko moderne. + +### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square) + +- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Premiers démarrages natifs et essais matériels sur le Pixel 3a. diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index fae6411a..4eb33b18 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,9 @@ + + + + diff --git a/android/app/src/main/java/org/vulpes_os/preview/AndroidPersonalData.java b/android/app/src/main/java/org/vulpes_os/preview/AndroidPersonalData.java new file mode 100644 index 00000000..ad17c798 --- /dev/null +++ b/android/app/src/main/java/org/vulpes_os/preview/AndroidPersonalData.java @@ -0,0 +1,172 @@ +package org.vulpes_os.preview; + +import android.Manifest; +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.database.ContentObserver; +import android.os.Handler; +import android.os.Looper; +import java.util.HashMap; +import java.util.Map; +import android.net.Uri; +import android.provider.CallLog; +import android.provider.ContactsContract; +import android.provider.Telephony; +import org.json.JSONArray; +import org.json.JSONObject; + +/** Read-through access. Android remains the owner of contacts and telephony records. */ +final class AndroidPersonalData { + private final Context context; + private final Handler main = new Handler(Looper.getMainLooper()); + private final Map observers = new HashMap<>(); + private final Map pending = new HashMap<>(); + void changed(String kind) { + Runnable previous = pending.remove(kind); + if (previous != null) main.removeCallbacks(previous); + Runnable next = () -> { + pending.remove(kind); + VulpesApplication app = (VulpesApplication) context; + if (app.port == null) return; + try { app.port.postMessage(new JSONObject().put("type", "android-data-changed").put("kind", kind)); } + catch (Exception ignored) { /* The resume event refreshes detached sessions. */ } + }; + pending.put(kind, next); + main.postDelayed(next, 250); + } + void observe() { + for (String kind : new String[]{"contacts", "sms", "calls"}) { + if (granted(kind) && !observers.containsKey(kind)) { + ContentObserver observer = new ContentObserver(main) { + @Override public void onChange(boolean selfChange) { changed(kind); } + }; + Uri uri = kind.equals("contacts") ? ContactsContract.Contacts.CONTENT_URI : + kind.equals("sms") ? Telephony.Sms.CONTENT_URI : CallLog.Calls.CONTENT_URI; + try { + context.getContentResolver().registerContentObserver(uri, true, observer); + observers.put(kind, observer); + } catch (SecurityException ignored) { /* Permission can be revoked during registration. */ } + } else if (!granted(kind) && observers.containsKey(kind)) { + context.getContentResolver().unregisterContentObserver(observers.remove(kind)); + } + } + } + + AndroidPersonalData(Context context) { this.context = context; } + + static String permission(String kind) { + switch (kind) { + case "contacts": return Manifest.permission.READ_CONTACTS; + case "sms": return Manifest.permission.READ_SMS; + case "calls": return Manifest.permission.READ_CALL_LOG; + default: throw new IllegalArgumentException("INVALID_DATA_KIND"); + } + } + + boolean granted(String kind) { + return context.getSharedPreferences("personal-data", 0).getBoolean(kind, false) && + context.checkSelfPermission(permission(kind)) == PackageManager.PERMISSION_GRANTED; + } + + void enable(String kind, boolean value) { + permission(kind); + context.getSharedPreferences("personal-data", 0).edit().putBoolean(kind, value).apply(); + observe(); + changed(kind); + } + + JSONObject status() throws Exception { + JSONObject result = new JSONObject(); + for (String kind : new String[]{"contacts", "sms", "calls"}) result.put(kind, granted(kind)); + return result; + } + + JSONObject page(JSONObject params) throws Exception { + String kind = params.getString("kind"); + if (!granted(kind)) throw new SecurityException("ANDROID_DATA_PERMISSION_DENIED"); + long after = params.optLong("after", 0); + if (after < 0) throw new IllegalArgumentException("INVALID_CURSOR"); + Uri uri; + String[] columns; + switch (kind) { + case "contacts": + uri = ContactsContract.Contacts.CONTENT_URI; + columns = new String[]{"_id", "display_name", "starred", "contact_last_updated_timestamp"}; + break; + case "sms": + uri = Telephony.Sms.CONTENT_URI; + columns = new String[]{"_id", "thread_id", "address", "body", "date", "type", "read", "status"}; + break; + default: + uri = CallLog.Calls.CONTENT_URI; + columns = new String[]{"_id", "number", "date", "duration", "type"}; + } + JSONArray rows = new JSONArray(); + long last = after; + boolean more = false; + ContentResolver resolver = context.getContentResolver(); + // A key cursor avoids SQL LIMIT syntax differences between Android providers. + try (Cursor cursor = resolver.query(uri, columns, "_id > ?", new String[]{Long.toString(after)}, "_id ASC")) { + if (cursor == null) throw new IllegalStateException("ANDROID_PROVIDER_UNAVAILABLE"); + int bytes = 0; + while (cursor.moveToNext()) { + if (rows.length() >= 100 || bytes > 512 * 1024) { more = true; break; } + JSONObject row = new JSONObject(); + for (int i = 0; i < columns.length; i++) { + row.put(columns[i], cursor.isNull(i) ? JSONObject.NULL : + cursor.getType(i) == Cursor.FIELD_TYPE_INTEGER ? cursor.getLong(i) : cursor.getString(i)); + } + last = cursor.getLong(0); + if (kind.equals("contacts")) contactDetails(last, row); + rows.put(row); + bytes += row.toString().length() * 2; + } + } + return new JSONObject().put("rows", rows).put("next", more ? last : JSONObject.NULL); + } + + private void contactDetails(long id, JSONObject contact) throws Exception { + JSONArray phones = new JSONArray(), emails = new JSONArray(); + contact.put("tel", phones).put("email", emails); + try (Cursor c = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, + new String[]{"mimetype", "data1", "data2", "data3", "is_primary"}, + "contact_id = ? AND mimetype IN (?, ?, ?)", new String[]{Long.toString(id), + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, + ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, + ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE}, "_id ASC")) { + if (c == null) throw new IllegalStateException("ANDROID_PROVIDER_UNAVAILABLE"); + while (c.moveToNext()) { + String mime = c.getString(0); + if (mime.equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)) { + if (!contact.has("givenName")) contact.put("givenName", new JSONArray().put(c.getString(2))) + .put("familyName", new JSONArray().put(c.getString(3))); + } else { + boolean phone = mime.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + int type = c.getInt(2); + String label = type == 0 ? c.getString(3) : phone ? + (type == 2 ? "mobile" : type == 1 ? "home" : type == 3 ? "work" : "other") : + (type == 1 ? "home" : type == 2 ? "work" : "other"); + (phone ? phones : emails).put(new JSONObject().put("value", c.getString(1)) + .put("type", new JSONArray().put(label == null ? "other" : label)).put("pref", c.getInt(4) != 0)); + } + } + } + } + + Intent open(JSONObject params) { + String kind = params.optString("kind"); + if (kind.equals("contacts")) { + String id = params.optString("id"); + if (!id.matches("[1-9][0-9]{0,15}")) throw new IllegalArgumentException("INVALID_CONTACT"); + if (!granted(kind)) throw new SecurityException("ANDROID_DATA_PERMISSION_DENIED"); + return new Intent(Intent.ACTION_VIEW, ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id))); + } + if (kind.equals("sms")) return new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_APP_MESSAGING); + if (kind.equals("calls")) return new Intent(Intent.ACTION_VIEW, CallLog.Calls.CONTENT_URI); + throw new IllegalArgumentException("INVALID_DATA_KIND"); + } +} diff --git a/android/app/src/main/java/org/vulpes_os/preview/AndroidServices.java b/android/app/src/main/java/org/vulpes_os/preview/AndroidServices.java index 64020f99..8aded31a 100644 --- a/android/app/src/main/java/org/vulpes_os/preview/AndroidServices.java +++ b/android/app/src/main/java/org/vulpes_os/preview/AndroidServices.java @@ -24,6 +24,7 @@ final class AndroidServices { CONTACT = 412; static final long MAX_MEDIA = 32L * 1024 * 1024; final VulpesApplication app; + final AndroidPersonalData personal; final ExecutorService io = Executors.newSingleThreadExecutor(); final Handler main = new Handler(Looper.getMainLooper()); GeckoResult pending; @@ -31,6 +32,7 @@ final class AndroidServices { AndroidServices(VulpesApplication app) { this.app = app; + personal = new AndroidPersonalData(app); } GeckoResult request(JSONObject message) { @@ -40,6 +42,30 @@ final class AndroidServices { JSONObject p = message.optJSONObject("params"); if (p == null) p = new JSONObject(); switch (op) { + case "android.personal": + JSONObject personalParams = p; + String operation = p.optString("operation"); + if (operation.equals("permission")) { + String kind = p.getString("kind"); + activity().permission(new String[]{AndroidPersonalData.permission(kind)}, granted -> { + try { personal.enable(kind, granted); result.complete(personal.status()); } catch (Exception e) { fail(result, e); } + }); + } else if (operation.equals("status")) result.complete(personal.status()); + else if (operation.equals("disconnect")) { + personal.enable(p.getString("kind"), false); + result.complete(personal.status()); + } + else if (operation.equals("open")) { + activity().startActivity(personal.open(p)); + result.complete(null); + } else if (operation.equals("page")) io.execute(() -> { + try { + JSONObject data = personal.page(personalParams); + main.post(() -> result.complete(data)); + } catch (Exception e) { fail(result, e); } + }); + else throw new IllegalArgumentException("METHOD_NOT_SUPPORTED"); + break; case "android.notification": JSONObject request = p; if (p.optString("operation").equals("permission")) { diff --git a/android/app/src/main/java/org/vulpes_os/preview/MainActivity.java b/android/app/src/main/java/org/vulpes_os/preview/MainActivity.java index 640a5578..458c8586 100644 --- a/android/app/src/main/java/org/vulpes_os/preview/MainActivity.java +++ b/android/app/src/main/java/org/vulpes_os/preview/MainActivity.java @@ -82,8 +82,8 @@ public final class MainActivity extends Activity { webPanel.addView(nav, new LinearLayout.LayoutParams(-1, dp(52))); Button back = new Button(this); back.setText("‹"); - back.setContentDescription("Retour au bureau"); - back.setOnClickListener(v -> closeBrowser()); + back.setContentDescription("Retour"); + back.setOnClickListener(v -> back()); nav.addView(back, new LinearLayout.LayoutParams(dp(55), -1)); address = new EditText(this); address.setSingleLine(true); @@ -99,6 +99,9 @@ public final class MainActivity extends Activity { return true; }); webView = new GeckoView(this); + // The web panel is layered over Gaia and hidden when returning to an app. + // A TextureView follows that visibility without leaving a separate surface. + webView.setViewBackend(GeckoView.BACKEND_TEXTURE_VIEW); webPanel.addView(webView, new LinearLayout.LayoutParams(-1, 0, 1)); home = new Button(this); home.setText("◯"); @@ -297,10 +300,12 @@ public final class MainActivity extends Activity { } void closeBrowser() { + boolean wasVisible = webPanel.getVisibility() == View.VISIBLE; webPanel.setVisibility(View.GONE); gaiaView.setVisibility(View.VISIBLE); setHomeSurface(app.homeVisible); syncActive(); + if (wasVisible) app.browserClosed(); } private void back() { @@ -470,7 +475,7 @@ public final class MainActivity extends Activity { else callback.accept(granted); } - private void permission(String[] names, java.util.function.Consumer callback) { + void permission(String[] names, java.util.function.Consumer callback) { boolean granted = true; for (String name : names) granted &= checkSelfPermission(name) == PackageManager.PERMISSION_GRANTED; diff --git a/android/app/src/main/java/org/vulpes_os/preview/VulpesApplication.java b/android/app/src/main/java/org/vulpes_os/preview/VulpesApplication.java index 3a46db7e..4e44e8ea 100644 --- a/android/app/src/main/java/org/vulpes_os/preview/VulpesApplication.java +++ b/android/app/src/main/java/org/vulpes_os/preview/VulpesApplication.java @@ -150,6 +150,15 @@ public final class VulpesApplication extends Application { ); } + void browserClosed() { + if (port == null) return; + try { + port.postMessage(new JSONObject().put("type", "browser-closed")); + } catch (Exception e) { + Log.w("Vulpes", "Browser close notification", e); + } + } + void home(boolean held) { if (port == null) return; try { @@ -160,6 +169,7 @@ public final class VulpesApplication extends Application { } void resumed() { + if (services != null) services.personal.observe(); sendScreenLock(); if (port == null) return; try { diff --git a/android/extension/background.js b/android/extension/background.js index 4baab916..e8d628e4 100644 --- a/android/extension/background.js +++ b/android/extension/background.js @@ -1,3 +1,4 @@ +import {AndroidPersonalData, authorizePersonal} from './personal-data.mjs'; import {Input} from './services/input.mjs'; import { Packages, packageURL } from './services/packages.mjs'; import { Activities, isGaiaActivity } from './services/activities.mjs'; @@ -15,7 +16,7 @@ const input = new Input({identity:peer=>peer.app,broadcast}); let editSequence=0; const nativePackages=(operation,data={})=>browser.runtime.sendNativeMessage('vulpes',{type:'packages.'+operation,...data}).then(JSON.parse); async function refreshInstalled(){const installed=await nativePackages('list');apps.splice(0,apps.length,...apps.filter(a=>!a.installed),...installed);} -let apps, values, settings, dataStores, contacts, messages, connections, alarms, storage; +let apps, values, settings, dataStores, contacts, messages, connections, alarms, storage, personal; const identity = (peer) => peer.app; function notify(peer, type, data) { try { @@ -121,6 +122,7 @@ const ready = (async () => { contacts = new Contacts(storage, (data) => broadcast('contactchange', data)); await contacts.init(); messages = new Messages(storage); + personal = new AndroidPersonalData(params=>android("personal",params), contacts, messages, storage); dataStores = new DataStoreService(apps, storage, (data) => broadcast('datastorechange', data)); connections = new Connections(identity, notify); alarms = new Alarms( @@ -140,6 +142,7 @@ const ready = (async () => { })(); // Java owns this port. Web pages have no access to native messaging. let native; +let activeWebView; let systemReady = false; let pendingScreenLock = false; function deliverScreenLock() { @@ -163,15 +166,26 @@ function connectNative() { native.onDisconnect.addListener(() => setTimeout(connectNative, 1000)); native.onMessage.addListener(async (message) => { await ready; + if (message.type === 'browser-closed' && activeWebView) { + const {peer, contextId} = activeWebView; + activeWebView = null; + notify(peer, 'view', {contextId, type:'close', detail:{}}); + } if (['home', 'holdhome'].includes(message.type)) broadcast(message.type, {}, 'system'); if (message.type === 'android-screen-off') { pendingScreenLock = true; deliverScreenLock(); } + if (message.type === 'android-data-changed') { + broadcast('android-data-changed', {kind:message.kind}, message.kind === 'sms' ? 'sms' : 'communications'); + } if (message.type === 'android-resume') { deliverScreenLock(); broadcast('screen-on', {}, 'system'); await refreshAndroid().catch(console.warn); + broadcast('android-data-changed', {kind:'contacts'}, 'communications'); + broadcast('android-data-changed', {kind:'calls'}, 'communications'); + broadcast('android-data-changed', {kind:'sms'}, 'sms'); } if (message.type === 'notification-click') { pendingNotification = message.data; @@ -215,6 +229,12 @@ async function handle(peer, request) { authorizePlatform(app, method.slice(9), params); method = 'android.' + method.slice(9); } + if (method === 'android.personal') { + authorizePersonal(app, params.kind, params.operation); + if (params.operation === 'page') return personal.rows(params.kind); + if (!['status','permission','disconnect','open'].includes(params.operation)) throw Error('METHOD_NOT_SUPPORTED'); + return android('personal', params); + } if (method === 'android.capabilities') { const release = await (await fetch('release.json')).json(); const device = app.id === 'settings' ? await android('snapshot') : {}; @@ -355,8 +375,8 @@ async function handle(peer, request) { } if (method === 'datastores.list') return dataStores.list(app, params.name); if (method === 'datastores.run') return dataStores.run(app, params); - if (method === 'contacts.request') return contacts.request(app, params); - if (method === 'messages.request') return messages.request(app, params); + if (method === 'contacts.request') return personal.contactRequest(app, params); + if (method === 'messages.request') return personal.messageRequest(app, params); if (method === 'alarms.request') return alarms.request(peer, app, params); if (method === 'iac.subscribe') { connections.subscribe(peer); @@ -397,6 +417,7 @@ async function handle(peer, request) { throw Error('PERMISSION_DENIED'); if (params.operation === 'open') { await openWeb(params.url); + activeWebView = {peer, contextId:params.contextId}; notify(peer, 'view', { contextId: params.contextId, type: 'loadend', @@ -502,6 +523,7 @@ browser.runtime.onConnect.addListener((port) => { attached .then(() => { peers.delete(peer); + if (activeWebView?.peer === peer) activeWebView = null; input.cleanup(peer); for(const edit of peer.edits.values()) {clearTimeout(edit.timer);edit.reject(Error('INPUT_CONTEXT_EXPIRED'));} peer.edits.clear(); diff --git a/android/extension/content.js b/android/extension/content.js index 4c1b7d5c..745fbb1e 100644 --- a/android/extension/content.js +++ b/android/extension/content.js @@ -37,10 +37,8 @@ } if (message.event) { if(message.event.type==='input-mode') { - gaiaKeyboard=message.event.data.enabled===true; - if(!gaiaKeyboard) restoreMode(); - win.VulpesNativeInput=gaiaKeyboard; - win.dispatchEvent(new window.Event('vulpes-input-configured')); + inputConfigurationRevision++; + configureInput(message.event.data.enabled===true); } win.dispatchEvent( new window.CustomEvent('vulpes-service-event', { detail: cloneInto(message.event, win) }), @@ -53,6 +51,8 @@ callback.resolve(cloneInto(message.reply, win)); } function onDisconnect() { + inputConfigurationRevision++; + configureInput(false); for (const callback of pending.values()) callback.reject(new window.Error('VULPES_HOST_CLOSED')); pending.clear(); @@ -60,14 +60,15 @@ reconnect = setTimeout(() => { try { connect(); + refreshInputConfiguration(); } catch (_) { onDisconnect(); } }, 1000); } - connect(); const editor = new InputEditor(window); let gaiaKeyboard = false; + let inputConfigurationRevision = 0; const originalModes = new WeakMap(); function restoreMode() { const field = editor.inputElement; @@ -77,21 +78,27 @@ else field.setAttribute('inputmode', value); originalModes.delete(field); } - request({version:1,id:0,method:'input.config',params:{}}).then(reply => { - gaiaKeyboard = reply.result === true; + function configureInput(enabled) { + gaiaKeyboard = enabled; + if(!enabled) restoreMode(); win.VulpesNativeInput = gaiaKeyboard; win.dispatchEvent(new window.Event('vulpes-input-configured')); - }).catch(error => console.error('Gaia input configuration:', error)); - for (const type of ['focusin', 'pointerdown', 'click']) addEventListener(type, event => { - if (!gaiaKeyboard || editor.editing || location.hostname === 'keyboard.localhost') return; - let element = event.target; + if(enabled && !document.hidden && document.hasFocus()) reportFocus(document.activeElement); + } + function refreshInputConfiguration() { + const revision = inputConfigurationRevision; + request({version:1,id:0,method:'input.config',params:{}}).then(reply => { + if(revision===inputConfigurationRevision) configureInput(reply.result===true); + }).catch(error => console.error('Gaia input configuration:', error)); + } + function reportFocus(element) { + if (!gaiaKeyboard || editor.editing || location.hostname === 'keyboard.localhost') return false; if (element?.isContentEditable) element=element.closest('[contenteditable=true]') || element; const editable = element?.isContentEditable || (['input','textarea'].includes(element?.localName) && !['button','submit','range','checkbox','radio','date','time','datetime-local','file'].includes(element.type)); if (!editable || element.disabled || element.readOnly) { - if (type === 'click' && !element?.closest?.('[data-vulpes-keep-input]')) port.postMessage({inputFocus:null}); - return; + return false; } if (element !== editor.inputElement) restoreMode(); editor.focus(element); @@ -101,9 +108,18 @@ const state=editor.state(); state.inputMode=originalModes.get(element) || (element.classList.contains('recipient')?'tel':''); port.postMessage({inputFocus:state}); + return true; + } + connect(); + refreshInputConfiguration(); + for (const type of ['focusin', 'pointerdown', 'click']) addEventListener(type, event => { + if (!gaiaKeyboard || editor.editing || location.hostname === 'keyboard.localhost') return; + if (!reportFocus(event.target) && type === 'click' && + !event.target?.closest?.('[data-vulpes-keep-input]')) port.postMessage({inputFocus:null}); }, true); addEventListener('visibilitychange', () => { if (document.hidden && gaiaKeyboard) { restoreMode(); port.postMessage({inputFocus:null}); } + else if (gaiaKeyboard && document.hasFocus()) reportFocus(document.activeElement); }); addEventListener('unload', () => clearTimeout(reconnect)); exportFunction(request, win.navigator, { defineAs: 'vulpesRequest' }); diff --git a/android/extension/personal-data.mjs b/android/extension/personal-data.mjs new file mode 100644 index 00000000..b97e1c9a --- /dev/null +++ b/android/extension/personal-data.mjs @@ -0,0 +1,88 @@ +import {Contacts} from './Contacts.mjs'; +import {Messages} from './Messages.mjs'; + +export function authorizePersonal(app, kind, operation) { + if (app.installed || !['settings', 'communications', 'sms', 'system'].includes(app.id)) + throw Error('PERMISSION_DENIED'); + if (operation === 'status' && app.id === 'settings') return; + if (!['contacts', 'sms', 'calls'].includes(kind)) throw Error('INVALID_DATA_KIND'); + if (['permission', 'disconnect'].includes(operation)) { + if (app.id !== 'settings') throw Error('PERMISSION_DENIED'); + return; + } + if (kind === 'contacts' && !app.manifest.permissions?.contacts?.access?.includes('read')) throw Error('PERMISSION_DENIED'); + if (kind === 'sms' && app.id !== 'sms') throw Error('PERMISSION_DENIED'); + if (kind === 'calls' && app.id !== 'communications') throw Error('PERMISSION_DENIED'); +} + +export function contactFromAndroid(row) { + return {id:'android:'+row._id, name:[row.display_name || ''], givenName:row.givenName || [], + familyName:row.familyName || [], tel:row.tel || [], email:row.email || [], + category:row.starred ? ['favorite'] : [], updated:new Date(row.contact_last_updated_timestamp || 0).toISOString()}; +} +export function smsFromAndroid(row) { + // Negative IDs keep Android provider rows separate from existing Vulpes messages. + if (![row._id, row.thread_id].every(n => Number.isSafeInteger(n) && n > 0)) throw Error('INVALID_ANDROID_ID'); + const incoming = row.type === 1; + return {id:-row._id, threadId:-row.thread_id, type:'sms', + sender:incoming ? row.address : null, receiver:incoming ? null : row.address, + body:row.body || '', timestamp:row.date, read:!!row.read, + delivery:incoming ? 'received' : row.type === 2 ? 'sent' : row.type === 5 ? 'error' : 'sending', + deliveryStatus:row.status === 0 ? 'success' : row.status >= 64 ? 'error' : 'not-applicable'}; +} + +export class AndroidPersonalData { + constructor(native, contacts, messages, storage) { + Object.assign(this, {native, contacts, messages, storage}); + } + async rows(kind) { + const status = await this.native({operation:'status'}); + if (!status[kind]) return []; + const rows = []; + let after = 0; + do { + const page = await this.native({operation:'page', kind, after}); + rows.push(...page.rows); + if (rows.length > 100000) throw Error('ANDROID_DATA_TOO_LARGE'); + if (page.next === null) break; + if (!Number.isSafeInteger(page.next) || page.next <= after) throw Error('INVALID_CURSOR'); + after = page.next; + } while (true); + return rows; + } + async contactRequest(app, params) { + const write = ['save', 'remove', 'clear'].includes(params.operation); + const access = app.manifest.permissions?.contacts?.access || ''; + if (!access.includes(write ? 'write' : 'read')) throw Error('PERMISSION_DENIED'); + // Third-party apps keep the local address book and never inherit Android's grant. + if (app.installed || !['communications','sms','system'].includes(app.id)) return this.contacts.request(app, params); + if (write) { + if (String(params.contact?.id || params.id || '').startsWith('android:') || + params.operation === 'clear' && (await this.native({operation:'status'})).contacts) + throw Error('ANDROID_DATA_READ_ONLY'); + return this.contacts.request(app, params); + } + const remote = (await this.rows('contacts')).map(contactFromAndroid); + const local = await this.contacts.request(app, {operation:'all'}); + const view = new Contacts(null, ()=>{}); + let revision = this.contacts.data.revision; + for (const c of remote) for (const character of JSON.stringify(c)) revision = (revision * 31 + character.charCodeAt(0)) >>> 0; + view.data = {revision, contacts:[...local, ...remote]}; + return view.request(app, params); + } + async messageRequest(app, params) { + if (!app.manifest.permissions?.sms) throw Error('PERMISSION_DENIED'); + if (app.installed || app.id !== 'sms') return this.messages.request(app, params); + const {operation, args=[]} = params; + if (['delete','markMessageRead'].includes(operation) && [args[0]].flat().some(id => id < 0)) + throw Error('ANDROID_DATA_READ_ONLY'); + if (!['getMessages','getThreads','getMessage'].includes(operation)) return this.messages.request(app, params); + const remote = (await this.rows('sms')).filter(row => row.type !== 3).map(smsFromAndroid); + const local = await this.messages.request(app, {operation:'getMessages'}); + const view = new Messages({run:async(_store, op)=>{ + if (op !== 'get') throw Error('ANDROID_DATA_READ_ONLY'); + return {value:[...local, ...remote]}; + }}); + return view.request(app, params); + } +} diff --git a/android/tools/probe-android.py b/android/tools/probe-android.py index f6591e57..985d5ca5 100644 --- a/android/tools/probe-android.py +++ b/android/tools/probe-android.py @@ -3,14 +3,15 @@ import json,sys,time from rdp import RDP -def evaluate(host, script): - r=RDP() +def evaluate(host, script, connection=None): + hostname, _, path = host.partition('/') + r=connection or RDP() try: for process in r.call('root','listProcesses')['processes']: if process['isParent']: continue target=r.call(process['actor'],'getTarget')['process'] if 'webIsolated' not in target.get('remoteType',''): continue - text='''(() => { const w=[...Services.ww.getWindowEnumerator()].find(w=>w.location.hostname===%s); if(!w)return null; return w.wrappedJSObject.eval(%s); })()''' % (json.dumps(host+'.localhost'),json.dumps(script)) + text='''(() => { const w=[...Services.ww.getWindowEnumerator()].find(w=>w.location.hostname===%s && (!%s || w.location.pathname.startsWith(%s))); if(!w)return null; return w.wrappedJSObject.eval(%s); })()''' % (json.dumps(hostname+'.localhost'),json.dumps(path),json.dumps('/'+path),json.dumps(script)) response=r.call(target['consoleActor'],'evaluateJSAsync',text=text) if 'resultID' not in response: continue while True: @@ -20,24 +21,32 @@ def evaluate(host, script): if value.get('result') is not None and value.get('result') != {'type':'null'}: return value.get('result') break raise RuntimeError('App not open: '+host) - finally:r.s.close() + finally: + if connection is None:r.s.close() -def run(host,expression,timeout=30): +def _run(host,expression,timeout,connection): start=time.monotonic()+timeout while True: try: - evaluate(host,'window.__androidProbe=null; Promise.resolve().then(async()=>('+expression+')).then(value=>window.__androidProbe=JSON.stringify({value}),error=>window.__androidProbe=JSON.stringify({error:String(error),stack:error.stack})); "started"') + evaluate(host,'window.__androidProbe=null; Promise.resolve().then(async()=>('+expression+')).then(value=>window.__androidProbe=JSON.stringify({value}),error=>window.__androidProbe=JSON.stringify({error:String(error),stack:error.stack})); "started"',connection) break - except (RuntimeError, EOFError, OSError) as e: + except RuntimeError as e: if time.monotonic()>=start:raise - if isinstance(e, RuntimeError) and not str(e).startswith('App not open:'):raise + if not str(e).startswith('App not open:'):raise time.sleep(.3) until=time.monotonic()+timeout while time.monotonic() { + const app = location.hostname.split('.')[0]; + const fr = () => (document.documentElement.lang || navigator.language).startsWith('fr'); + const text = (f,e) => fr() ? f : e; + const call = params => VulpesCompat.call('android.personal', params); + const notice = message => window.VulpesGaiaUI?.notice(message); + const readOnly = () => notice(text('Ces données appartiennent à Android. Modifiez-les dans l’application Android.', + 'Android owns these records. Edit them in the Android app.')); + const failure = () => notice(text('Accès aux données Android indisponible. Vérifiez les autorisations dans Paramètres.', + 'Android data is unavailable. Check permissions in Settings.')); + let dirty = false; + let selectedContact; + const pendingCallChanges = new Set(); + function refreshCallLog() { + if (document.hidden || !window.CallLog?.sticky) return; + if (pendingCallChanges.has('calls')) { + CallLog.callLogContainer.textContent = ''; + CallLog.render(); + } else if (pendingCallChanges.has('contacts')) { + CallLog._contactCache = false; + CallLog.updateListWithContactInfo('update'); + } + pendingCallChanges.clear(); + } + if(app==='communications' && location.pathname.startsWith('/contacts')) { + // Gaia's first-paint HTML cache must not retain Android names after revocation. + localStorage.removeItem('firstChunk'); + document.addEventListener('click',event=>{ + const row=event.target.closest?.('[data-uuid]'); + if(row) selectedContact=row.dataset.uuid; + },true); + let cache; + Object.defineProperty(window,'Cache',{configurable:true,get:()=>cache,set:value=>{ + cache=value; + Object.defineProperties(cache,{ + enabled:{get:()=>false},active:{get:()=>false},firstChunk:{set:()=>{}} + }); + cache.apply=()=>Promise.reject(); + }}); + } + function canRefresh() { + if (document.hidden) return false; + if (app === 'sms') return window.Navigation?.isCurrentPanel('thread-list'); + if (location.pathname.startsWith('/contacts')) return window.MainNavigation?.currentView() === 'view-contacts-list'; + return false; + } + let refreshingMessages = false; + async function refreshMessages() { + const view=window.ConversationView, id=view?.activeThread?.id; + if(refreshingMessages || !(id < 0) || document.hidden || !window.Navigation?.isCurrentPanel('thread'))return; + refreshingMessages=true; + try { + const rows=await VulpesCompat.call('messages.request',{operation:'getMessages',args:[{threadId:id}]}); + if(view.activeThread?.id!==id || document.hidden)return; + const ids=new Set(rows.map(row=>String(row.id))); + for(const node of document.querySelectorAll('[data-message-id]')) { + if(Number(node.dataset.messageId)<0 && !ids.has(node.dataset.messageId))view.removeMessageDOM(node); + } + for(const row of rows) { + const key=JSON.stringify(row),old=document.getElementById('message-'+row.id); + if(old?.dataset.androidRecord===key)continue; + const message={...row,timestamp:new Date(row.timestamp)}; + window.Threads?.registerMessage(message); + await view.appendMessage(message,false); + const node=document.getElementById('message-'+row.id);if(node)node.dataset.androidRecord=key; + } + dirty=false; + } catch(error){failure();}finally{refreshingMessages=false;} + } + function refresh() { + if (app === 'communications' && location.pathname.startsWith('/dialer')) { + refreshCallLog(); + return; + } + if (dirty && selectedContact && !document.hidden && window.MainNavigation?.currentView()==='view-contact-details') { + dirty = false; + const id = selectedContact; + VulpesCompat.call('contacts.request',{operation:'find',options:{filterBy:['id'],filterOp:'equals',filterValue:id}}) + .then(rows=>{if(rows.length)Contacts.updateContactDetail(id);else Contacts.goBack();}).catch(failure); + return; + } + if(dirty && app==='sms')refreshMessages(); + if (!dirty || !canRefresh()) return; + dirty = false; + if(app==='sms' && window.InboxView?.container && !InboxView.inEditMode) InboxView.renderThreads(); + else if(window.contacts?.List?.load) contacts.List.load(undefined,true); + } + addEventListener('visibilitychange', refresh); + addEventListener('hashchange', refresh); + addEventListener('transitionend', refresh); + addEventListener('vulpes-service-event', ({detail}) => { + if (detail.type !== 'android-data-changed') return; + if (app === 'communications' && location.pathname.startsWith('/dialer')) { + pendingCallChanges.add(detail.data.kind); + refreshCallLog(); + return; + } + dirty = true; + refresh(); + }); + + // Keep Gaia's call grouping/rendering while reading the current Android log. + if (app === 'communications' && location.pathname.startsWith('/dialer')) { + let value; + Object.defineProperty(window, 'CallLogDBManager', {configurable:true, + get:()=>value, set:db=>{ + value=db; + const original = Object.fromEntries(['getGroupList','getGroup','getGroupAtPosition'].map(k=>[k,db[k].bind(db)])); + const groups = async () => { + const rows = await call({operation:'page',kind:'calls'}); + const list = new Map(); + for (const row of rows) { + const recent = {date:row.date,number:row.number || '',type:row.type===2 ? 'dialing':'incoming', + status:row.type===1 ? 'connected':null}; + const id=db._getGroupId(recent), key=JSON.stringify(id); + if(!list.has(key)) list.set(key,{id,number:recent.number,serviceId:0,lastEntryDate:row.date,retryCount:0,calls:[]}); + const g=list.get(key);g.lastEntryDate=Math.max(g.lastEntryDate,row.date);g.retryCount++; + g.calls.push({date:row.date,duration:row.duration*1000}); + } + return [...list.values()].map(g=>{g.calls.sort((a,b)=>b.date-a.date);return db._getGroupObject(g);}); + }; + let nativeCalls=false; + const active=async()=> (nativeCalls=!!(await call({operation:'status',kind:'calls'})).calls); + db.getGroupList=async(callback,sortedBy,prev,cursor,limit)=>{ + try { + if(!await active()) return original.getGroupList(callback,sortedBy,prev,cursor,limit); + // Native groups do not live in Gaia's IndexedDB contact cache. + if(window.CallLog)CallLog._contactCache=false; + let list=(await groups()).sort((a,b)=>(a.lastEntryDate-b.lastEntryDate)*(prev?-1:1)); + if(limit>0)list=list.slice(0,limit); + if(!cursor)return callback(list); + let index=0; + const next=()=>queueMicrotask(()=>callback({value:list[index++] || null,continue:next}));next(); + } catch(error) { failure(); callback(cursor?{value:null}:[]); } + }; + db.getGroup=async(number,date,type,status)=>{ + if(!await active())return original.getGroup(number,date,type,status); + const key=db._getGroupId({number,date,type,status}).join('-'); + const found=(await groups()).find(g=>g.id===key); + if(!found)throw Error('NotFoundError');return found; + }; + db.getGroupAtPosition=async(position,sortedBy,prev,type,callback)=>{ + if(!await active())return original.getGroupAtPosition(position,sortedBy,prev,type,callback); + try {const list=(await groups()).filter(g=>!type||g.type===type).sort((a,b)=>(a.lastEntryDate-b.lastEntryDate)*(prev?-1:1));callback(list[position-1]||null);} + catch(error){failure();callback(null);} + }; + document.addEventListener('click', event=>{ + if(!nativeCalls || !event.target.closest?.('#call-log-icon-edit'))return; + // Editing Android logs is intentionally delegated in this first integration. + event.preventDefault();event.stopImmediatePropagation();readOnly(); + call({operation:'open',kind:'calls'}).catch(failure); + },true); + }}); + } + if(app==='communications' && location.pathname.startsWith('/contacts')) { + const timer=setInterval(()=>{ + if(!window.Contacts?.showForm)return; + clearInterval(timer); + const original=Contacts.showForm; + Contacts.showForm=function(edit,contact) { + if(edit && String(contact?.id).startsWith('android:')) { + selectedContact=contact.id; + call({operation:'open',kind:'contacts',id:contact.id.slice(8)}).catch(failure); + return; + } + return original.apply(this,arguments); + }; + },100); + addEventListener('pagehide',()=>clearInterval(timer),{once:true}); + } + function initialize() { + if (app !== 'settings') return; + const root=document.querySelector('#root > div'); + if(!root || document.querySelector(".vulpes-android-data"))return; + const header=document.createElement('header');header.className='vulpes-android-data'; + const title=document.createElement('h2');title.textContent=text('Données Android','Android data');header.append(title); + const list=document.createElement('ul');list.className='vulpes-android-data'; + const hint=document.createElement('p');hint.style.cssText='margin:1rem 1.5rem;font-size:1.4rem;line-height:1.5'; + hint.textContent=text('Lecture des contacts, SMS (hors MMS) et appels Android. Envoi, modification et suppression dans Android. Les contacts créés dans Gaia restent locaux.', + 'Read Android contacts, SMS (not MMS) and calls. Send, edit and delete in Android. Contacts created in Gaia stay local.'); + root.append(header,hint,list); + for(const [kind,french,english] of [['contacts','Contacts','Contacts'],['sms','SMS','SMS'],['calls','Journal d’appels','Call history']]) { + const li=document.createElement('li'),button=document.createElement('button'); + li.append(button);list.append(li); + let enabled=false; + const update=state=>{enabled=state[kind];button.textContent=text(french,english)+' — '+(enabled?text('Déconnecter','Disconnect'):text('Autoriser la lecture','Allow reading'));}; + call({operation:'status'}).then(update).catch(failure); + button.onclick=async()=>{ + button.disabled=true; + try { + const disconnect=enabled; + const state=await call({operation:disconnect?'disconnect':'permission',kind});update(state); + if(!disconnect && !state[kind])notice(text('Autorisation refusée ou restreinte par Android. L’application Android reste disponible.', + 'Permission denied or restricted by Android. Your Android app is still available.')); + } catch(error){failure();} finally{button.disabled=false;} + }; + } + } + if(app==='settings') new MutationObserver(initialize).observe(document.documentElement,{childList:true,subtree:true}); + if(document.readyState==='loading')addEventListener('DOMContentLoaded',initialize,{once:true});else initialize(); +})(); diff --git a/assets/webapps/communications.gaiamobile.org/dialer/gaia_build_defer_index.js b/assets/webapps/communications.gaiamobile.org/dialer/gaia_build_defer_index.js index 7141e811..9a83f306 100644 --- a/assets/webapps/communications.gaiamobile.org/dialer/gaia_build_defer_index.js +++ b/assets/webapps/communications.gaiamobile.org/dialer/gaia_build_defer_index.js @@ -405,7 +405,7 @@ window.performance.measure('callLogReady','callLogStart');return;} self._empty=false;var currDate=new Date(cursor.value.date);batchGroupCounter++;if(!prevDate||(currDate.getTime()==prevDate.getTime())){chunk.push(cursor.value);}else{daysToRender.push(chunk);chunk=[cursor.value];var renderNow=false;if(batchGroupCounter>=MAX_GROUPS_FOR_FIRST_RENDER&&!screenRendered){renderNow=true;screenRendered=true;window.performance.mark('firstChunkReady');}else if(batchGroupCounter>=MAX_GROUPS_TO_BATCH_RENDER){renderNow=true;} if(renderNow){self.renderSeveralDays(daysToRender);daysToRender=[];batchGroupCounter=0;}} prevDate=currDate;cursor.continue();},'lastEntryDate',true,true);},renderSeveralDays:function cl_renderSeveralDays(chunks){for(var i=0,l=chunks.length;i=MAX_GROUPS_FOR_FIRST_RENDER&&!screenRendered){renderNow=true;screenRendered=true;window.performance.mark('firstChunkReady');}else if(batchGroupCounter>=MAX_GROUPS_TO_BATCH_RENDER){renderNow=true;} if(renderNow){self.renderSeveralDays(daysToRender);daysToRender=[];batchGroupCounter=0;}} prevDate=currDate;cursor.continue();},'lastEntryDate',true,true);},renderSeveralDays:function cl_renderSeveralDays(chunks){for(var i=0,l=chunks.length;i{ + if(busy)return; + status(text('Le catalogue est fermé. Vous pouvez le rouvrir ci-dessous.', + 'The catalogue is closed. You can reopen it below.')); + document.getElementById('open').hidden=true; + }); function browse(){labels();message.hidden=true;dialog.hidden=true;frame.style.visibility='visible';frame.src='https://vulpes-os.org/marketplace/?mode=app&lang='+(fr()?'fr':'en');} function status(value){frame.style.visibility='hidden';message.hidden=false;document.getElementById('status').textContent=value;} async function prepare(url){ diff --git a/changelog.json b/changelog.json index 96d2f307..b99b823a 100644 --- a/changelog.json +++ b/changelog.json @@ -1,19 +1,19 @@ { "schema": 1, "preamble": { - "fr": "# Journal des modifications — Vulpes OS\n\n[English](CHANGELOG.en.md)\n\nPC, Android (APK) et Tundra/Sargo. Les statuts indiquent des sources en développement, un APK construit ou une version publiée. Les changements des sources nécessitent une mise à jour du paquet installé.\n", - "en": "# Changelog — Vulpes OS\n\n[Français](CHANGELOG.md)\n\nDesktop, Android (APK) and Tundra/Sargo. Status indicates development sources, a built APK or a published release. Source changes require an update to the installed package.\n" + "fr": "# Journal des modifications — Vulpes OS\n\n[English](CHANGELOG.en.md)\n\nLes nouveautés, par date et par plateforme. Dans chaque groupe : Add, Change, Fix, Note, Test. Les entrées décrivent la situation à leur date ; une correction en développement nécessite une nouvelle version installée.\n", + "en": "# Changelog — Vulpes OS\n\n[Français](CHANGELOG.md)\n\nUpdates by date and platform. Within each group: Add, Change, Fix, Note, Test. Entries describe the state at their date; a fix in development requires an updated installed version.\n" }, "entries": [ { - "id": "2.7-preview.20", + "id": "2.7-preview.21", "text": { - "fr": "## 2.7-preview.20 — APK construit · 13 octobre 2026\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview 20 réunit les corrections communes depuis l’APK Preview 17 : paramètres Gaia, apparence, sélecteurs, clavier, contacts, Marketplace et médias.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Photo : enregistrement WebM avec miniature et lecture dans Galerie/Vidéo. Autorisation micro demandée ; commandes adaptées aux capacités du matériel.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Caméra : changement de capteur, arrêt et reprise fiabilisés. PC et Android utilisent leurs API caméra ; Sargo conserve son adaptateur HAL.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : mises à jour Wi-Fi, Bluetooth, appels, SMS/MMS et réglages réseau incluses dans les sources. Les fonctions non raccordées restent indiquées dans les panneaux.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Changelog : reprise des textes simplifiés FR/EN, badges conservés, filtres PC/APK/Sargo indépendants des titres. Markdown, site et notes de release issus du même JSON.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) APK signé avec la clé des Preview précédentes ; alignement et cohérence des 53 fichiers partagés vérifiés. Validation d’exécution Android en cours.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Gecko PC/Sargo 156.0.1 ; GeckoView Android 156.0. Gaia 2.7.0. L’APK délègue appels/SMS à Android : il ne remplace pas le système téléphonique Android.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Preview expérimentale : Compte Mozilla/Sync, localisation distante, extensions Firefox OS et transfert USB restent incomplets. Sargo : aperçu autour de 16 FPS ; son des vidéos et audio téléphonique à qualifier séparément.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Pixel 3a : Preview 20 r62 démarrée en RAM puis flashée sur boot_a. Empreinte relue identique ; démarrage installé, onze contrôles Gaia et dix contrôles natifs réussis. Données conservées, Wi-Fi connecté et enregistrement LTE observé. Pas de nouvelle conversation audio testée.\n", - "en": "## 2.7-preview.20 — APK built · 13 October 2026\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview 20 brings together shared fixes since APK Preview 17: Gaia settings, appearance, selectors, keyboard, contacts, Marketplace and media.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Camera: WebM recording with posters and Gallery/Video playback. Microphone permission requested; controls follow hardware capabilities.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera: more reliable sensor switching, stopping and resuming. Desktop and Android use their camera APIs; Sargo retains its HAL adapter.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: Wi-Fi, Bluetooth, calls, SMS/MMS and network settings updates included in the sources. Unimplemented functions remain identified in their panels.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Changelog: simplified French/English text and badges retained; desktop/APK/Sargo filters independent of headings. Markdown, website and release notes generated from one JSON.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) APK signed with the previous Preview key; alignment and consistency of 53 shared files verified. Android runtime validation in progress.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Desktop/Sargo Gecko 156.0.1; Android GeckoView 156.0. Gaia 2.7.0. The APK delegates calls/SMS to Android; it does not replace Android telephony.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Experimental Preview: Mozilla account/Sync, remote location, Firefox OS add-ons and USB file transfer remain incomplete. Sargo: preview around 16 fps; recorded sound and call audio require separate qualification.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Pixel 3a: Preview 20 r62 RAM-booted, then flashed to boot_a. Matching readback hash; installed startup, eleven Gaia checks and ten native checks passed. Data retained, Wi-Fi connected and LTE registration observed. No new two-way audio call tested.\n" + "fr": "## 14/10/2026 : 2.7-preview.21\n\n![APK publié](https://img.shields.io/badge/APK%20publi%C3%A9-2F855A?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Affichage](https://img.shields.io/badge/Affichage-475569?style=flat-square) : Messages des fonctions indisponibles plus lisibles en thèmes clair et sombre.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Clavier](https://img.shields.io/badge/Clavier-475569?style=flat-square) : Dictionnaires supplémentaires disponibles hors ligne ; activation et reprise du clavier Gaia fiabilisées. La vérification sur les appareils concernés reste nécessaire.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Journal d’appels](https://img.shields.io/badge/Journal%20d%E2%80%99appels-475569?style=flat-square) : Affichage du nom des contacts rétabli au premier chargement du journal.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Panneaux Stockage rétablis. Une erreur de chargement ne bloque plus les autres menus.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-2F855A?style=flat-square) ![Données Android](https://img.shields.io/badge/Donn%C3%A9es%20Android-475569?style=flat-square) : Lecture des contacts, SMS et journaux Android dans Gaia, après autorisation. Les données locales de Vulpes sont conservées.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Retour vers Vulpes sans écran blanc persistant ; un catalogue fermé peut être rouvert.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Clavier](https://img.shields.io/badge/Clavier-475569?style=flat-square) : Le rectangle blanc signalé reste à reproduire sur les appareils concernés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Données Android](https://img.shields.io/badge/Donn%C3%A9es%20Android-475569?style=flat-square) : Première étape en lecture seule, hors MMS. Envoi et édition des données Android dans les applications Android ; les nouveaux contacts Gaia restent locaux. Accès SMS et journal selon les autorisations de la ROM et de l’installateur. Essais sur Android 9 ; autres versions à confirmer.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Les corrections communes de Gaia sont incluses dans les images complètes et les mises à jour de démarrage.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Nouvelle image d’installation construite ; démarrage et flash sur Pixel à vérifier avant publication.\n", + "en": "## 14/10/2026 : 2.7-preview.21\n\n![APK published](https://img.shields.io/badge/APK%20published-2F855A?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Appearance](https://img.shields.io/badge/Appearance-475569?style=flat-square) : Unavailable-feature messages are easier to read in light and dark themes.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Call history](https://img.shields.io/badge/Call%20history-475569?style=flat-square) : Contact names now appear when the call history first loads.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Keyboard](https://img.shields.io/badge/Keyboard-475569?style=flat-square) : Additional dictionaries available offline; improved Gaia keyboard activation and recovery. Verification on affected devices is still needed.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Storage panels restored. A loading error no longer locks the other menus.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-2F855A?style=flat-square) ![Android data](https://img.shields.io/badge/Android%20data-475569?style=flat-square) : Read Android contacts, SMS and call history in Gaia after granting access. Existing local Vulpes data is preserved.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Return to Vulpes without a persistent white overlay; a closed catalogue can be reopened.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Keyboard](https://img.shields.io/badge/Keyboard-475569?style=flat-square) : The reported blank keyboard still needs reproduction on the affected devices.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Android data](https://img.shields.io/badge/Android%20data-475569?style=flat-square) : First, read-only integration, excluding MMS. Sending and editing Android records use Android apps; new Gaia contacts stay local. SMS and call log access depend on ROM and installer permissions. Tested on Android 9; other versions need verification.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Shared Gaia fixes are included in full installation images and boot updates.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : New installation image built; Pixel boot and flashing must be tested before publication.\n" }, "metadata": { "kind": "version", - "status": "built", + "status": "published", "platforms": [ "pc", "apk", @@ -24,11 +24,31 @@ ] } }, + { + "id": "2.7-preview.20", + "text": { + "fr": "## 13/10/2026 : 2.7-preview.20\n\n![Publié](https://img.shields.io/badge/Publi%C3%A9-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Mode vidéo, avec miniature et lecture dans Galerie et Vidéo.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Améliorations des paramètres, de l’apparence, des sélecteurs, du clavier, des contacts et des médias.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Changement de capteur, arrêt et reprise fiabilisés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Services](https://img.shields.io/badge/Services-475569?style=flat-square) : Compte Mozilla, Sync, localisation distante, extensions et transfert USB restent incomplets.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Publication](https://img.shields.io/badge/Publication-475569?style=flat-square) : APK Preview 20 disponible.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Compatibilité](https://img.shields.io/badge/Compatibilit%C3%A9-475569?style=flat-square) : Appels et SMS utilisent Android. Cette Preview n’a pas encore été validée en utilisation sur Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Aperçu autour de 16 images par seconde.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Mise à jour du Wi-Fi, du Bluetooth, des appels, des SMS/MMS et des réglages réseau.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Audio](https://img.shields.io/badge/Audio-475569?style=flat-square) : Son des vidéos et conversation téléphonique à vérifier séparément.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Preview 20 installée sur le Pixel 3a, données conservées. Wi-Fi connecté et réseau 4G détecté.\n\n### ![Web](https://img.shields.io/badge/Web-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Changelog](https://img.shields.io/badge/Changelog-475569?style=flat-square) : Historique FR/EN simplifié, badges et filtres par plateforme. Même contenu pour le site et les releases.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.20)\n", + "en": "## 13/10/2026 : 2.7-preview.20\n\n![Published](https://img.shields.io/badge/Published-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Video mode, with thumbnails and playback in Gallery and Video.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Improvements to settings, appearance, pickers, keyboard, contacts and media.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : More reliable camera switching, shutdown and resume.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Services](https://img.shields.io/badge/Services-475569?style=flat-square) : Mozilla Account, Sync, remote location, extensions and USB transfer remain incomplete.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Release](https://img.shields.io/badge/Release-475569?style=flat-square) : Preview 20 APK available.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Compatibility](https://img.shields.io/badge/Compatibility-475569?style=flat-square) : Calls and SMS use Android. This Preview has not yet been validated in use on Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Preview runs at around 16 frames per second.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Updates to Wi-Fi, Bluetooth, calls, SMS/MMS and network settings.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Audio](https://img.shields.io/badge/Audio-475569?style=flat-square) : Video sound and two-way call audio still need separate testing.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Preview 20 installed on Pixel 3a with data preserved. Wi-Fi connected and 4G registration observed.\n\n### ![Web](https://img.shields.io/badge/Web-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Changelog](https://img.shields.io/badge/Changelog-475569?style=flat-square) : Simpler French and English history, with badges and platform filters. Shared content for the website and releases.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.20)\n" + }, + "metadata": { + "kind": "version", + "status": "published", + "platforms": [ + "pc", + "apk", + "models", + "web" + ], + "models": [ + "sargo" + ] + } + }, { "id": "development-2026-10-12-video-clock", "text": { - "fr": "## En développement — 12 octobre 2026 — Vidéo et réglages de l’heure\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Photo : enregistrement WebM VP8/Opus avec autorisation micro, miniature et stockage. Tampon limité à 32 Mio, arrêt avant libération du capteur.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Photo, Galerie et Vidéo : prise en charge des fichiers WebM et de leurs miniatures.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Paramètres : véritables sélecteurs Date/Heure Gaia, retour du clavier intégré et lettres non tronquées dans les listes.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Améliorer Vulpes : lien vers les tickets du projet. Services non raccordés expliqués dans leurs panneaux.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : vidéo simulée 1920 × 1080 relue ; photo, galerie, reprise caméra et navigation vérifiées.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo r61 en RAM : vidéo 480 × 640 relue, huit bascules avant/arrière réussies. Médias de test supprimés ; son enregistré non écouté.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : aperçu mesuré autour de 16 FPS contre 12 dans le test précédent. 30 FPS restent à atteindre.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : heure automatique par NITZ, réglage persistant et protection des écritures manuelles. Synchronisation dépendante du réseau ; pas de NTP de secours, fuseau choisi manuellement.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Android : ressources préparées et Java compilé, sans nouvel APK ni test vidéo Android à cette étape. Compte Mozilla/Sync, localisation distante, extensions Firefox OS et transfert USB restent à implémenter. Aucun flash ni publication.\n", - "en": "## In development — 12 October 2026 — Video and clock settings\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Camera: WebM VP8/Opus recording with microphone permission, poster and storage. Buffer limited to 32 MiB; recording stops before releasing the sensor.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera, Gallery and Video: handle WebM files and their posters.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Settings: original Gaia date/time pickers, Back from built-in keyboard settings and unclipped select labels.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Improve Vulpes: link to project issues. Unavailable services explained in their panels.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: simulated 1920 × 1080 video decoded; photo, gallery, camera resume and navigation checked.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo r61 in RAM: 480 × 640 video decoded, eight front/rear switches passed. Test media deleted; recorded audio not listened to.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: preview measured around 16 fps versus 12 in the previous test. 30 fps is not reached yet.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: automatic NITZ time, persistent setting and guarded manual writes. Sync depends on carrier time; no NTP fallback, timezone selected manually.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Android: assets staged and Java compiled, without a new APK or Android video test at this stage. Mozilla account/Sync, remote location, Firefox OS add-ons and USB file transfer remain unimplemented. No flashing or publication.\n" + "fr": "## 12/10/2026 : Vidéo et heure\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Enregistrement vidéo avec son, miniature et lecture dans Galerie et Vidéo.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Aide](https://img.shields.io/badge/Aide-475569?style=flat-square) : « Améliorer Vulpes » mène aux tickets du projet.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Sélecteurs de date et d’heure rétablis ; retour du menu Clavier et texte des listes corrigés.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Enregistrement vérifié avec une caméra simulée.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Changements préparés pour un prochain APK ; vidéo non encore testée sur Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Aperçu amélioré, autour de 16 images par seconde.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Horloge](https://img.shields.io/badge/Horloge-475569?style=flat-square) : Heure automatique selon les informations du réseau ; fuseau horaire encore manuel.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Vidéo et changement de capteur vérifiés. Son des vidéos encore à écouter.\n", + "en": "## 12/10/2026 : Video and time\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Video recording with sound, thumbnails and playback in Gallery and Video.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Help](https://img.shields.io/badge/Help-475569?style=flat-square) : “Improve Vulpes” opens the project’s issues.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Date and time pickers restored; Keyboard back navigation and list text fixed.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Recording checked with a simulated camera.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Changes prepared for a future APK; video not yet tested on Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Improved preview, at around 16 frames per second.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Clock](https://img.shields.io/badge/Clock-475569?style=flat-square) : Automatic time depends on network information; time zone remains manual.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Video recording and camera switching checked. Video sound still needs listening tests.\n" }, "metadata": { "kind": "development", @@ -46,8 +66,8 @@ { "id": "development-2026-10-12-settings-calls-hotspot", "text": { - "fr": "## En développement — 12 octobre 2026 — Appels et partage Wi-Fi\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Dialogues Gaia : fermeture après ouverture, transitions interrompues et nouvelle saisie après validation refusée.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : délai des services opérateur augmenté ; réglages lents séparés des commandes voix/SMS.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : double appel, présentation du numéro et quatre règles de renvoi raccordés à oFono, avec validation et relecture.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : point d’accès Wi-Fi WPA2 ou ouvert, configuration NetworkManager et pare-feu adapté. Mot de passe privé, accessible uniquement à Paramètres.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) r59 en RAM : 69 panneaux, dialogues et APN vérifiés sur PC/Pixel. Point d’accès enregistré, activé puis arrêté depuis Gaia ; Wi-Fi précédent restauré. 44 tests Python et régressions des dialogues réussis.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Transit Internet vers un autre appareil non testé. Messagerie vocale, blocage d’appels, PIN/PUK, certificats Wi-Fi et partage USB restent ouverts. Ressources Android synchronisées ; aucun nouvel APK, flash ou publication.\n", - "en": "## In development — 12 October 2026 — Calls and Wi-Fi sharing\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Gaia dialogs: close after opening, complete interrupted transitions and allow retry after rejected validation.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: longer carrier-service timeout; slow settings separated from voice/SMS commands.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: call waiting, caller ID and four forwarding rules connected to oFono, with validation and readback.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: WPA2 or open Wi-Fi hotspot, NetworkManager configuration and compatible firewall. Private password, accessible only to Settings.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) r59 in RAM: 69 panels, dialogs and APNs checked on desktop/Pixel. Hotspot saved, started and stopped through Gaia; previous Wi-Fi restored. 44 Python tests and dialog regressions passed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Internet forwarding to another device untested. Voicemail, call barring, PIN/PUK, Wi-Fi certificates and USB tethering remain open. Android assets synchronized; no new APK, flashing or publication.\n" + "fr": "## 12/10/2026 : Appels et partage Wi-Fi\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Fermeture des dialogues et nouvelle tentative après une erreur corrigées.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Appels](https://img.shields.io/badge/Appels-475569?style=flat-square) : Réglages du double appel, de l’affichage du numéro et du renvoi d’appel.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Partage de connexion avec ou sans mot de passe.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Les réglages lents ne bloquent plus les appels et les SMS.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Activation du point d’accès vérifiée ; accès Internet d’un autre appareil encore à tester.\n", + "en": "## 12/10/2026 : Calls and hotspot\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Dialog closing and retry after an error fixed.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Calls](https://img.shields.io/badge/Calls-475569?style=flat-square) : Settings for call waiting, caller ID and call forwarding.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Hotspot with or without a password.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Slow settings no longer block calls and SMS.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Hotspot activation checked; Internet access from another device still needs testing.\n" }, "metadata": { "kind": "development", @@ -65,8 +85,8 @@ { "id": "development-2026-10-12-settings-network", "text": { - "fr": "## En développement — 12 octobre 2026 — Paramètres réseau\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wi-Fi : adresse IPv4 et débit réels ; ne plus afficher « undefined » lorsqu’une mesure manque.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : choix GSM/UMTS/LTE et modification des APN Internet/MMS existants, avec validation et relecture.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) APN : refuser les changements d’un profil actif, protéger IMS et les mots de passe, tenter la restauration après échec et signaler son résultat.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : file bornée pour les réglages lents. Lecture des appels en 20 ms pendant une attente de réglages de 5 secondes.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 38 tests Python, 69 panneaux PC et parcours APN/réseau sur Pixel en RAM vérifiés. Ressources Android synchronisées.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Ajout, suppression et réinitialisation des APN indisponibles. Sélection manuelle d’opérateur et certificats encore ouverts. Aucun nouvel APK, flash ou publication.\n", - "en": "## In development — 12 October 2026 — Network settings\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wi-Fi: actual IPv4 address and link speed; no “undefined” label when a measurement is missing.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: GSM/UMTS/LTE selection and editing of existing Internet/MMS APNs, with validation and readback.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) APNs: reject changes to active profiles, protect IMS and passwords, attempt rollback after failure and report its result.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: bounded queue for slow settings. Call status read in 20 ms during a five-second settings wait.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 38 Python tests, 69 desktop panels and APN/network workflows on RAM-booted Pixel checked. Android assets synchronized.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) APN creation, deletion and reset unavailable. Manual carrier selection and certificates still open. No new APK, flashing or publication.\n" + "fr": "## 12/10/2026 : Paramètres réseau\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Adresse IP et vitesse de connexion affichées correctement.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Choix du type de réseau et modification des points d’accès mobiles.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Réglages réseau plus fiables lorsque le modem répond lentement.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Ajout, suppression et réinitialisation des points d’accès encore incomplets.\n", + "en": "## 12/10/2026 : Network settings\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : IP address and connection speed displayed correctly.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Network type selection and mobile access point editing.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : More reliable network settings when the modem responds slowly.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Adding, deleting and resetting access points remain incomplete.\n" }, "metadata": { "kind": "development", @@ -84,8 +104,8 @@ { "id": "development-2026-10-12-settings-audit", "text": { - "fr": "## En développement — 12 octobre 2026 — Audit des paramètres\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Paramètres : navigation récupérable après échec d’un contrôleur ou d’un dialogue ; génération cohérente des modules.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Filtres d’accessibilité et assistance Vulpes. Panneaux d’origine conservés avec explication des fonctions indisponibles.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) PC : statistiques du profil et téléchargements Gecko. Android : statistiques du stockage privé.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : données mobiles, itinérance, horloge et Wi-Fi masqué raccordés. Erreurs des anciennes interfaces réseau du panneau Son corrigées.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 97 vues inventoriées ; 69 panneaux PC/Pixel ouverts et sept dialogues natifs vérifiés. Stockage, données et fuseau relus après écriture sur r51 en RAM.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Les vues contextuelles et services indisponibles ne sont pas tous qualifiés. Java Android compilé, sans nouvel APK. Aucun flash, ticket fermé ni publication.\n", - "en": "## In development — 12 October 2026 — Settings audit\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Settings: recover navigation after a controller or dialog fails; consistent module generation.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Accessibility filters and Vulpes support. Original panels retained with explanations for unavailable features.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Desktop: profile statistics and Gecko downloads. Android: private storage statistics.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: mobile data, roaming, clock and hidden Wi-Fi connected. Legacy network errors in Sound settings fixed.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 97 views inventoried; 69 desktop/Pixel panels opened and seven native dialogs checked. Storage, data and timezone read back after writes on r51 in RAM.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Contextual views and unavailable services are not all qualified. Android Java compiled, without a new APK. No flashing, ticket closure or publication.\n" + "fr": "## 12/10/2026 : Revue des paramètres\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Navigation, accessibilité et aide corrigées. Les panneaux incomplets restent visibles.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Vérification](https://img.shields.io/badge/V%C3%A9rification-475569?style=flat-square) : Menus parcourus ; certaines actions dépendent encore du matériel ou de l’opérateur.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Stockage](https://img.shields.io/badge/Stockage-475569?style=flat-square) : Informations de stockage et téléchargements raccordés.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Stockage](https://img.shields.io/badge/Stockage-475569?style=flat-square) : Affichage de l’espace utilisé par Vulpes.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Données mobiles, itinérance, heure, réseaux Wi-Fi masqués et panneau Son corrigés.\n", + "en": "## 12/10/2026 : Settings review\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Navigation, accessibility and help fixed. Incomplete panels remain visible.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Testing](https://img.shields.io/badge/Testing-475569?style=flat-square) : Menus reviewed; some actions still depend on hardware or the carrier.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Storage](https://img.shields.io/badge/Storage-475569?style=flat-square) : Storage information and downloads connected.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Storage](https://img.shields.io/badge/Storage-475569?style=flat-square) : Display of storage used by Vulpes.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Mobile data, roaming, time, hidden Wi-Fi networks and Sound panel fixed.\n" }, "metadata": { "kind": "development", @@ -103,8 +123,8 @@ { "id": "development-2026-10-12-settings-navigation", "text": { - "fr": "## En développement — 12 octobre 2026 — Navigation des paramètres\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Listes déroulantes : sélecteur Gaia avec confirmation/annulation ; choix Clair/Sombre accessible. Gestionnaire SIM adapté à un emplacement.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Panneaux indisponibles : explication et commandes désactivées au lieu de liens sans effet.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : réseaux Wi-Fi mémorisés séparés des scans lents ; cache conservé lors des lectures d’état.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : informations SIM, centre SMS et accusés de réception reliés au modem.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) r45 en RAM : huit contrôles d’apparence, cinq panneaux et changement réel des accusés SMS validés, puis réglage restauré. Sélecteur PC vérifié ; ressources APK préparées.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Certificats Enterprise et autres options opérateur encore indisponibles. Aucun SMS émis, nouvel APK, flash ou publication.\n", - "en": "## In development — 12 October 2026 — Settings navigation\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Dropdowns: Gaia selector with confirm/cancel; Light/Dark choice accessible. SIM manager adapted to one slot.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Unavailable panels: explanations and disabled controls instead of unresponsive links.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: saved Wi-Fi networks separated from slow scans; cache preserved during status reads.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: SIM information, SMS centre and delivery reports connected to the modem.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) r45 in RAM: eight appearance checks, five panels and actual SMS report setting changes passed, then setting restored. Desktop selector checked; APK assets staged.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Enterprise certificates and other carrier options still unavailable. No SMS sent, new APK, flashing or publication.\n" + "fr": "## 12/10/2026 : Navigation des paramètres\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Apparence](https://img.shields.io/badge/Apparence-475569?style=flat-square) : Choix Clair/Sombre et validation ou annulation des sélecteurs rétablis.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SIM](https://img.shields.io/badge/SIM-475569?style=flat-square) : Gestionnaire adapté aux téléphones à une seule SIM.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Informations SIM, centre de messagerie et accusés de réception.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Chargement plus rapide des réseaux enregistrés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Certificats Wi-Fi, sécurité SIM et stockage USB encore incomplets.\n", + "en": "## 12/10/2026 : Settings navigation\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Appearance](https://img.shields.io/badge/Appearance-475569?style=flat-square) : Light/Dark selection and picker confirmation or cancellation restored.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SIM](https://img.shields.io/badge/SIM-475569?style=flat-square) : Manager adapted to single-SIM phones.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : SIM information, message centre and delivery reports.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Faster loading of saved networks.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Wi-Fi certificates, SIM security and USB storage remain incomplete.\n" }, "metadata": { "kind": "development", @@ -122,15 +142,13 @@ { "id": "development-2026-10-12-sargo-appearance", "text": { - "fr": "## En développement — 12 octobre 2026 — Correctifs communs sur Pixel 3a\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : boot r39 en RAM avec correctifs partagés et premier mode sombre. Noyau et configuration matérielle du r35 conservés.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Démarrage, taille d’écran, réglages persistants, batterie, interface d’appel et Fira vérifiés. Services modem, audio, Wi-Fi et Bluetooth actifs.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sept contrôles d’apparence réussis dans Gaia : thème propagé, en-têtes lisibles, libellés placés et retour au clair. Capture Pixel inspectée.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Outil de mise à jour Gaia dans un boot privé, avec empreintes, sources conservées et vérification des composants matériels inchangés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Aucun nouvel appel, SMS ou appairage testé. Thème complet et comportement Android encore à qualifier. Aucun nouvel APK, flash ou publication.\n", - "en": "## In development — 12 October 2026 — Shared fixes on Pixel 3a\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: r39 RAM boot with shared fixes and initial dark mode. r35 kernel and hardware configuration preserved.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Boot, viewport size, persistent settings, battery, call UI and Fira checked. Modem, audio, Wi-Fi and Bluetooth services active.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Seven Gaia appearance checks passed: propagated theme, readable headers, aligned labels and return to light mode. Pixel screenshot inspected.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Tool to update Gaia in a private boot image, with hashes, retained sources and checks for unchanged hardware components.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) No new call, SMS or pairing tested. Full theme and Android behavior still need qualification. No new APK, flashing or publication.\n" + "fr": "## 12/10/2026 : Apparence sur Pixel 3a\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Apparence](https://img.shields.io/badge/Apparence-475569?style=flat-square) : Modes clair et sombre communs disponibles sur le Pixel 3a.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Correctifs des paramètres et polices Firefox OS intégrés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Vérification](https://img.shields.io/badge/V%C3%A9rification-475569?style=flat-square) : Pas de nouvel essai des appels, SMS ou Bluetooth à cette étape.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Apparence](https://img.shields.io/badge/Apparence-475569?style=flat-square) : Thèmes et affichage vérifiés sur le téléphone.\n", + "en": "## 12/10/2026 : Appearance on Pixel 3a\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Appearance](https://img.shields.io/badge/Appearance-475569?style=flat-square) : Shared light and dark modes available on Pixel 3a.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Settings fixes and Firefox OS fonts included.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Testing](https://img.shields.io/badge/Testing-475569?style=flat-square) : No new call, SMS or Bluetooth test at this stage.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Appearance](https://img.shields.io/badge/Appearance-475569?style=flat-square) : Themes and display checked on the phone.\n" }, "metadata": { "kind": "development", "status": "development", "platforms": [ - "pc", - "apk", "models" ], "models": [ @@ -141,8 +159,8 @@ { "id": "development-2026-10-11-appearance-input", "text": { - "fr": "## En développement — 11 octobre 2026 — Apparence et clavier partagé\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Apparence : Clair, Sombre ou Selon le système, partagé entre les applications et conservé au redémarrage. Fonds d’écran, photos et sites externes préservés.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Clavier : opérations d’édition mutualisées, sélection et effacement, protection contre les réponses tardives.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : neuf contrôles d’apparence et gestes de saisie dans Messages réussis, sans envoi de SMS. Revue visuelle de Paramètres, Messages, Téléphone et Contacts.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Android : option expérimentale de clavier Gaia ; clavier Android conservé par défaut et mode de saisie restauré à la fermeture.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android : réessayer brièvement le même capteur encore occupé, sans réessayer après refus de permission ou fermeture de Photo.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Preview 19 construit localement : signature, alignement, parité et tests du pont/caméra réussis.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Clavier Gaia, caméra avant Android et thème complet encore à qualifier. Sources prêtes pour Sargo, resté sur r35 à cette étape. Aucun upload, flash ni ticket fermé.\n", - "en": "## In development — 11 October 2026 — Appearance and shared keyboard\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Appearance: Light, Dark or Follow system, shared between apps and retained across restarts. Wallpapers, photos and external websites preserved.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Keyboard: shared editing operations, selection and deletion, protection against late replies.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: nine appearance checks and Messages input gestures passed, without sending SMS. Visual review of Settings, Messages, Phone and Contacts.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Android: experimental Gaia keyboard option; Android keyboard remains the default, input mode restored on close.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android: briefly retry the same busy sensor, without retrying after permission denial or closing Camera.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Preview 19 built locally: signature, alignment, parity and bridge/camera tests passed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Gaia keyboard, Android front camera and full theme still need qualification. Sources ready for Sargo, which remained on r35 at this stage. No upload, flashing or ticket closure.\n" + "fr": "## 11/10/2026 : Apparence et clavier\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Apparence](https://img.shields.io/badge/Apparence-475569?style=flat-square) : Modes Clair, Sombre et Système, conservés au redémarrage.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Clavier](https://img.shields.io/badge/Clavier-475569?style=flat-square) : Sélection et suppression de texte corrigées.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Thèmes et saisie de SMS vérifiés.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Clavier](https://img.shields.io/badge/Clavier-475569?style=flat-square) : Clavier Gaia expérimental ; le clavier Android reste proposé par défaut.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Nouvelle tentative possible quand la caméra est occupée.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Vérification](https://img.shields.io/badge/V%C3%A9rification-475569?style=flat-square) : Preview 19 construite ; thèmes, clavier et caméra avant encore à vérifier sur Android.\n", + "en": "## 11/10/2026 : Appearance and keyboard\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Appearance](https://img.shields.io/badge/Appearance-475569?style=flat-square) : Light, Dark and System modes, preserved after restart.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Keyboard](https://img.shields.io/badge/Keyboard-475569?style=flat-square) : Text selection and deletion fixed.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Themes and SMS typing checked.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Keyboard](https://img.shields.io/badge/Keyboard-475569?style=flat-square) : Experimental Gaia keyboard; Android keyboard remains the default.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Retry available when the camera is busy.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Testing](https://img.shields.io/badge/Testing-475569?style=flat-square) : Preview 19 built; themes, keyboard and front camera still need testing on Android.\n" }, "metadata": { "kind": "development", @@ -160,8 +178,8 @@ { "id": "development-2026-10-11-settings", "text": { - "fr": "## En développement — 11 octobre 2026 — Paramètres et accueil\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Paramètres : gestion des sonneries, saisie/effacement du code PIN, désactivation du verrouillage et liste des permissions des applications tierces.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Accueil : première initialisation du second lanceur et aperçus des fonds d’écran.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Langues : actualiser les libellés Vulpes au changement de langue ; anglais de secours hors français. Fermer le panneau d’échec caméra et les bandeaux d’installation.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Android : ouvrir le volet Gaia en touchant la barre de statut. Preview 18 construit, signé et comparé aux sources.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : neuf parcours Gaia, cinq contrôles de bandeaux et douze tests activités/caméra réussis. Bluetooth Sargo r35 confirmé par l’utilisateur.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Redémarrage à chaud du compositeur encore instable : fichiers restaurés et retour à r35. Corrections non qualifiées sur Sargo à cette étape ; clavier/thème Android ouverts. Aucun APK publié ni flash.\n", - "en": "## In development — 11 October 2026 — Settings and homescreens\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Settings: ringtone management, PIN entry/deletion, lock disabling and third-party app permission list.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Home: first initialization of the second launcher and wallpaper previews.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Languages: refresh Vulpes labels after language changes; English fallback outside French. Dismiss camera failure panels and installation banners.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Android: open the Gaia tray by tapping the status bar. Preview 18 built, signed and compared with sources.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: nine Gaia workflows, five banner checks and twelve activity/camera tests passed. Sargo r35 Bluetooth confirmed by the user.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Compositor hot restart still unstable: files restored and return to r35. Fixes not yet qualified on Sargo at this stage; Android keyboard/theme open. No APK publication or flashing.\n" + "fr": "## 11/10/2026 : Paramètres et accueil\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Accueil](https://img.shields.io/badge/Accueil-475569?style=flat-square) : Second écran d’accueil, aperçus de fonds d’écran et bandeau d’installation corrigés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Fermeture du message d’erreur rétablie.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Sonneries, code de verrouillage, permissions et libellés FR/EN corrigés.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Ouverture du volet en touchant la barre de statut.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Preview 18 construite localement.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Retour à la version précédente après un redémarrage instable de l’interface.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Fonctionnement confirmé par l’utilisateur.\n", + "en": "## 11/10/2026 : Settings and home screen\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Home](https://img.shields.io/badge/Home-475569?style=flat-square) : Second home screen, wallpaper previews and installation banner fixed.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Error message dismissal restored.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Ringtones, lock code, permissions and French/English labels fixed.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Open the notification tray by tapping the status bar.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Preview 18 built locally.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : Returned to the previous version after an unstable interface restart.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Operation confirmed by the user.\n" }, "metadata": { "kind": "development", @@ -179,8 +197,8 @@ { "id": "development-2026-10-09-mms-bluetooth", "text": { - "fr": "## En développement — 9 octobre 2026 — MMS et Bluetooth\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Bluetooth : adaptateur Gaia partagé, commandes matérielles séparées et accès limité aux applications autorisées.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : activation, découverte, appairage explicite, connexion et suppression depuis le panneau Bluetooth Gaia. Modules audio Bluetooth intégrés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : services réseau Qualcomm et transport MMS raccordés. Une déconnexion D-Bus ne termine plus le daemon MMS. État persistant, reprise sans doublon ni renvoi automatique incertain.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) r35 en RAM : MMS avec image visible et accepté par le MMSC Orange ; réception destinataire à confirmer. Cinq appareils Bluetooth détectés, A2DP vers PC validé.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 191 tests Python Tundra et 18 tests JavaScript réussis. Ramdisk allégé et ressources Android synchronisées.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Audio d’appel via casque non qualifié. Aucun nouvel APK, flash ni push à cette étape.\n", - "en": "## In development — 9 October 2026 — MMS and Bluetooth\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Bluetooth: shared Gaia adapter, separate hardware commands and access restricted to authorized apps.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: power, discovery, explicit pairing, connection and removal from Gaia Bluetooth settings. Bluetooth audio modules included.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: Qualcomm network services and MMS transport connected. D-Bus disconnect no longer terminates the MMS daemon. Persistent state, retry without duplicates or uncertain automatic resends.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) r35 in RAM: image MMS visible and accepted by Orange MMSC; recipient delivery still unconfirmed. Five Bluetooth devices discovered, A2DP to desktop verified.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 191 Tundra Python tests and 18 JavaScript tests passed. Smaller ramdisk and synchronized Android assets.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Headset call audio unqualified. No new APK, flashing or push at this stage.\n" + "fr": "## 09/10/2026 : MMS et Bluetooth\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Panneaux Gaia reliés aux capacités de chaque plateforme.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Recherche, association, connexion, oubli d’appareils et sortie audio.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Envoi conservé et repris après une interruption.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Vérification](https://img.shields.io/badge/V%C3%A9rification-475569?style=flat-square) : MMS accepté par l’opérateur, réception non confirmée. Audio d’appel sur casque à tester.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Lecture audio Bluetooth vers un PC vérifiée.\n", + "en": "## 09/10/2026 : MMS and Bluetooth\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Gaia panels connected to each platform’s capabilities.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Discovery, pairing, connection, forgetting devices and audio output.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Sending preserved and resumed after interruption.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Testing](https://img.shields.io/badge/Testing-475569?style=flat-square) : MMS accepted by the carrier, delivery not confirmed. Headset call audio still needs testing.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Bluetooth audio playback to a PC checked.\n" }, "metadata": { "kind": "development", @@ -198,8 +216,8 @@ { "id": "development-2026-10-08-camera-mms", "text": { - "fr": "## En développement — 8 octobre 2026 — Caméra et transport MMS\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Caméra : arrêter le flux avant de détacher la vidéo ; attendre la fermeture du capteur, réinitialiser le viseur et recalculer sa taille après rotation.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) MMS : préserver les pièces jointes Blob et garder les messages en attente jusqu’à confirmation du transport.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : viseur WebGL réutilisé sans recapture vidéo intermédiaire ; écran maintenu éveillé pendant l’aperçu.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC et Sargo : parcours Photo/Galerie et huit bascules natives vérifiés. JPEG, focus et zoom fonctionnels ; arrière ~16 FPS, avant ~25–27 FPS dans cet essai.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : file MMS persistante, codec Nuntium et transport oFono. Interface texte/photo testée avec transport simulé.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Données mobiles bloquantes pour les MMS opérateur à cette étape. Ressources Android synchronisées ; aucun nouvel APK, flash ou push.\n", - "en": "## In development — 8 October 2026 — Camera and MMS transport\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera: stop the stream before detaching video; await sensor closure, reset the viewfinder and recalculate size after rotation.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) MMS: preserve Blob attachments and keep messages pending until transport confirmation.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: reused WebGL viewfinder without intermediate video capture; screen stays awake during preview.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop and Sargo: Camera/Gallery workflows and eight native switches checked. JPEG, focus and zoom working; rear ~16 fps, front ~25–27 fps in this test.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: persistent MMS queue, Nuntium codec and oFono transport. Text/photo UI tested with simulated transport.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Mobile data blocked carrier MMS at this stage. Android assets synchronized; no new APK, flashing or push.\n" + "fr": "## 08/10/2026 : Caméra et MMS\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Changement de capteur, arrêt et affichage après rotation corrigés.\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Pièces jointes conservées et envoi affiché en attente jusqu’à confirmation.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Aperçu mesuré autour de 16 images/s à l’arrière et 25 à 27 à l’avant.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Envoi réel encore bloqué par la connexion aux données mobiles.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Mise au point, zoom et prise de photo vérifiés.\n", + "en": "## 08/10/2026 : Camera and MMS\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Camera switching, shutdown and display after rotation fixed.\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Attachments preserved and sending shown as pending until confirmation.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Preview measured at around 16 fps on the rear camera and 25–27 on the front.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Real sending still blocked by the mobile data connection.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Focus, zoom and photo capture checked.\n" }, "metadata": { "kind": "development", @@ -217,8 +235,8 @@ { "id": "development-2026-10-08-call-log-dialogs", "text": { - "fr": "## 8 octobre 2026 — Rappel et messages d’erreur\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Dialogues Gaia : texte visible au lieu d’un écran gris avec un bouton seul.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Journal d’appel : rappel via le même service que le pavé numérique, sans anciennes API Gecko. Fichier partagé PC/Android/Sargo.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) MMS : signaler clairement l’envoi indisponible, garder texte et pièces jointes, ne plus annoncer un faux mode avion.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : dialogues FR/EN et composeur préservé. Sargo en RAM : 11 contrôles Gaia réussis, rappel testé avec modem simulé.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Aucun appel réel ni validation audio dans cette étape. Ressources Android synchronisées, aucun nouvel APK publié.\n", - "en": "## 8 October 2026 — Call-log redial and error dialogs\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Gaia dialogs: visible text instead of a grey screen with a lone button.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Call log: redial through the same service as the keypad, without legacy Gecko APIs. Shared desktop/Android/Sargo file.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) MMS: clearly report unavailable sending, retain text and attachments, no false airplane-mode message.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: FR/EN dialogs and preserved composer. RAM-booted Sargo: 11 Gaia checks passed, redial tested with a simulated modem.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) No real call or audio validation at this stage. Android assets synchronized, no new APK published.\n" + "fr": "## 08/10/2026 : Journal d’appel et dialogues\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Messages d’erreur lisibles, avec des boutons utilisables.\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Message clair si l’envoi est indisponible, sans perdre le brouillon.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Téléphone](https://img.shields.io/badge/T%C3%A9l%C3%A9phone-475569?style=flat-square) : Rappel depuis le journal d’appel rétabli.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Appels](https://img.shields.io/badge/Appels-475569?style=flat-square) : Parcours vérifié avec des appels simulés ; audio réel non testé.\n", + "en": "## 08/10/2026 : Call history and dialogs\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Readable error messages with usable buttons.\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![MMS](https://img.shields.io/badge/MMS-475569?style=flat-square) : Clear message when sending is unavailable, without losing the draft.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Phone](https://img.shields.io/badge/Phone-475569?style=flat-square) : Calling back from call history restored.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Calls](https://img.shields.io/badge/Calls-475569?style=flat-square) : Flow checked with simulated calls; real audio not tested.\n" }, "metadata": { "kind": "history", @@ -236,8 +254,8 @@ { "id": "development-2026-10-08-sms-audio", "text": { - "fr": "## En développement — 8 octobre 2026 — SMS et audio\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS : envoyer en un appui en conservant le clavier. Trombone raccordé au menu Gaia : image, audio, vidéo ou contact.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Interface : indicateur de volume visible, gestes du verrouillage et balayage des notifications corrigés.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : clavier, pièces jointes, Galerie, interface d’appel et volume vérifiés ; notification balayée sans déplacer la page. Aucun nouvel APK publié.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : accès à PulseAudio, relais Qualcomm, protocole D-Bus et périphériques de calibration rétablis. Service audio Android concurrent retiré.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : 11 contrôles Gaia, calibration et prévisualisations arrière/avant/arrière réussis.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Appels échouant avant sonnerie avec une erreur réseau dans cet essai. Audio bidirectionnel, geste Pixel et MMS encore non validés. Aucun flash ni publication.\n", - "en": "## In development — 8 October 2026 — SMS and audio\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS: send in one tap while keeping the keyboard. Paperclip connected to the Gaia image, audio, video or contact menu.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) UI: visible volume indicator, lockscreen gestures and notification swiping fixed.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: keyboard, attachments, Gallery, call UI and volume checked; notification swiped without moving the page. No new APK published.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: PulseAudio access, Qualcomm relay, D-Bus protocol and calibration devices restored. Conflicting Android audio service removed.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: 11 Gaia checks, calibration and rear/front/rear previews passed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Calls failed before ringing with a network error in this test. Two-way audio, Pixel gesture and MMS still unverified. No flashing or publication.\n" + "fr": "## 08/10/2026 : SMS et audio\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Affichage du volume, verrouillage et balayage des notifications corrigés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Envoi en un appui, sans fermer d’abord le clavier. Menu des pièces jointes rétabli.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Audio](https://img.shields.io/badge/Audio-475569?style=flat-square) : Corrections du routage du son des appels.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Appels](https://img.shields.io/badge/Appels-475569?style=flat-square) : Le réseau a empêché de vérifier une conversation réelle ; son dans les deux sens non confirmé.\n", + "en": "## 08/10/2026 : SMS and audio\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Volume display, lock screen and notification swiping fixed.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Send with one tap without first closing the keyboard. Attachment menu restored.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Audio](https://img.shields.io/badge/Audio-475569?style=flat-square) : Call audio routing fixes.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Calls](https://img.shields.io/badge/Calls-475569?style=flat-square) : Network issues prevented testing a real conversation; two-way audio not confirmed.\n" }, "metadata": { "kind": "development", @@ -255,8 +273,8 @@ { "id": "development-2026-10-08-radio-reliability", "text": { - "fr": "## En développement — 8 octobre 2026 — Fiabilité téléphonie\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : service radio maintenu après fermeture d’un client. Jamais de nouvel appel ou SMS automatique après une réponse perdue. Erreurs sans numéro ni texte du message.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Diagnostic réseau/audio sans identifiants personnels et paramètres opérateur épinglés dans l’image native.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS : attendre le vrai gestionnaire Gaia et accepter les identifiants oFono avec majuscules. Contrôle des conversations rétabli sans réémission.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : LTE retrouvé après redémarrage, SMS confirmé envoyé par le modem, microphone non silencieux et lecture audio acceptée.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Réception destinataire, audio d’appel bidirectionnel et stabilité modem restent à qualifier. Compositeur instable au redémarrage à chaud. Aucun nouvel APK, flash ou push.\n", - "en": "## In development — 8 October 2026 — Telephony reliability\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: radio service survives client closure. No automatic new call or SMS after a lost response. Errors exclude phone numbers and message text.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Network/audio diagnostics without personal identifiers, and pinned carrier settings in the native image.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS: wait for the actual Gaia manager and accept uppercase oFono IDs. Conversation checks restored without resending.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: LTE restored after reboot, SMS confirmed sent by the modem, non-silent microphone and audio playback accepted.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Recipient delivery, two-way call audio and modem stability remain unqualified. Compositor hot restart unstable. No new APK, flashing or push.\n" + "fr": "## 08/10/2026 : Fiabilité du réseau\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Messages associés à la bonne conversation.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Récupération du modem améliorée ; les nouvelles tentatives évitent de doubler appels et SMS.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Appels](https://img.shields.io/badge/Appels-475569?style=flat-square) : Stabilité du réseau et audio dans les deux sens encore à confirmer.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Retour sur le réseau 4G après redémarrage du modem vérifié.\n", + "en": "## 08/10/2026 : Network reliability\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Messages linked to the correct conversation.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Improved modem recovery; retries avoid duplicate calls and SMS.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Calls](https://img.shields.io/badge/Calls-475569?style=flat-square) : Network stability and two-way audio still need confirmation.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Return to the 4G network after modem restart checked.\n" }, "metadata": { "kind": "development", @@ -274,8 +292,8 @@ { "id": "2026-10-08-source-publication", "text": { - "fr": "## 8 octobre 2026 — Mise à jour des sources publiques\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Publication des correctifs Caméra, Contacts, SMS et Marketplace, et des outils Sargo de construction et de restauration.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) README français et anglais actualisés avec les fonctions et limites vérifiées.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Création du dossier de rapports lors du contrôle de parité Android sur un dépôt neuf.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Configuration Wi-Fi native vérifiée : aucun profil de connexion embarqué.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Documents internes, données personnelles et clés exclus du dépôt.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) APK public inchangé (Preview17) ; correctifs du 8 octobre non inclus. Aucune nouvelle image native publiée.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo : modem encore en recherche réseau ; audio des appels, appairage et profils Bluetooth à valider.\n", - "en": "## 8 October 2026 — Public source update\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Published Camera, Contacts, SMS and Marketplace fixes, plus Sargo build and recovery tools.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Updated French and English READMEs with verified features and limitations.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Create the report directory when checking Android asset parity in a fresh checkout.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Checked native Wi-Fi configuration: no bundled connection profiles.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Internal documents, personal data and keys excluded from the repository.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Public APK unchanged (Preview17); October 8 fixes not included. No new native image published.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo: modem still searching for a network; call audio, Bluetooth pairing and profiles await validation.\n" + "fr": "## 08/10/2026 : Sources publiques\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Sources](https://img.shields.io/badge/Sources-475569?style=flat-square) : Publication des corrections caméra, contacts, SMS et Marketplace, avec présentations FR/EN à jour.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Construction](https://img.shields.io/badge/Construction-475569?style=flat-square) : Construction depuis une copie neuve du dépôt corrigée.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : L’APK public reste en Preview 17 ; ces corrections sont dans les sources.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Recherche de réseau encore instable à cette étape ; pas de nouvelle image publiée.\n", + "en": "## 08/10/2026 : Public source code\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Source code](https://img.shields.io/badge/Source%20code-475569?style=flat-square) : Camera, contacts, SMS and Marketplace fixes published, with updated French/English project overviews.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Build](https://img.shields.io/badge/Build-475569?style=flat-square) : Building from a fresh repository copy fixed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : The public APK remains Preview 17; these fixes are in the source code.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Network search still unstable at this stage; no new image published.\n" }, "metadata": { "kind": "history", @@ -293,8 +311,8 @@ { "id": "development-2026-10-08-camera-lifecycle", "text": { - "fr": "## 8 octobre 2026 — Caméra et parcours Contacts · en développement\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Caméra : ouvertures successives, libération du capteur et identification avant/arrière corrigées.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Contacts : transport des photos et des dates corrigé sur PC, Android et Tundra.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Contacts : actualisation après modification, ouverture de SMS, sélection d’un numéro et préremplissage du pavé numérique rétablis.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Galerie : ouverture en mode sélection pour la photo d’un contact, même si l’application est déjà ouverte.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : fichiers Contacts corrigés inclus dans l’image de démarrage.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android : transmission du destinataire et du texte à l’application SMS, y compris les réponses et les numéros non encore validés.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Tests de caméra, stockage des contacts, permissions, transport binaire et activités.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : capture JPEG, Galerie, photo de contact, création, édition, recherche, favoris et suppression vérifiés. Aucun appel ni SMS émis.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo en RAM : autofocus, zoom, quatre bascules de caméra, capture et Galerie vérifiés ; parcours Contacts testés au toucher.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : conversations stockées, clavier et notifications vérifiés ; quatre réseaux Wi-Fi détectés. Nouveaux SMS et audio d’appel à valider.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : BlueZ et ses dépendances avec empreintes SHA256. Activation et recherche Bluetooth testées ; appairage et profils à valider.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : magasin de certificats natif. HTTPS, archives altérées, collisions de fichiers et reconstructions testés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Preview17 publié avec téléchargement et SHA256 vérifiés. Les correctifs ci-dessus restent dans les sources ; essai SMS Android réel nécessaire. Aucun flash Sargo.\n", - "en": "## 8 October 2026 — Camera and Contacts workflows · in development\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera: corrected sequential opening, sensor cleanup and front/rear identification.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Contacts: corrected photo and date transport on desktop, Android and Tundra.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Contacts: restored refresh after editing, SMS handoff, number picking and dialer prefilling.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Gallery: open the contact photo picker even when the app is already running.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: include corrected Contacts files in the boot image.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android: pass recipients and text to the SMS app, including replies and unconfirmed typed numbers.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Tests for camera lifecycle, contact storage, permissions, binary transport and activities.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: verified JPEG capture, Gallery, contact photos, creation, editing, search, favourites and deletion. No calls or SMS sent.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo in RAM: verified autofocus, zoom, four camera switches, capture and Gallery; tested Contacts with touch input.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: checked stored conversations, keyboard and notifications; detected four Wi-Fi networks. New SMS and call audio await validation.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: BlueZ and dependencies pinned by SHA256. Power-on and discovery tested; pairing and profiles await validation.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: native certificate store. Tested HTTPS, corrupted archives, file collisions and repeated builds.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Published Preview17 with download and SHA256 checks. These fixes remain in source; Android SMS needs a real-device test. No Sargo flash.\n" + "fr": "## 08/10/2026 : Caméra et contacts\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Ouverture et changement de capteur fiabilisés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Contacts](https://img.shields.io/badge/Contacts-475569?style=flat-square) : Photos, dates, modifications et choix d’un numéro depuis SMS ou Téléphone corrigés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Galerie](https://img.shields.io/badge/Galerie-475569?style=flat-square) : Sélection des médias corrigée.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Correctifs dans les sources ; APK public inchangé à cette étape.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Numéro et texte transmis correctement à l’application Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Recherche disponible ; association et usages audio encore à vérifier.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Photo, mise au point, zoom et changements de capteur vérifiés.\n", + "en": "## 08/10/2026 : Camera and contacts\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : More reliable opening and camera switching.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Contacts](https://img.shields.io/badge/Contacts-475569?style=flat-square) : Photos, dates, edits and number selection from Messages or Phone fixed.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Gallery](https://img.shields.io/badge/Gallery-475569?style=flat-square) : Media selection fixed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Fixes in source code; public APK unchanged at this stage.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Number and text passed correctly to the Android app.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Bluetooth](https://img.shields.io/badge/Bluetooth-475569?style=flat-square) : Discovery available; pairing and audio use still need testing.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Photo capture, focus, zoom and camera switching checked.\n" }, "metadata": { "kind": "history", @@ -312,27 +330,24 @@ { "id": "development-2026-10-06-marketplace-theme", "text": { - "fr": "## 6 octobre 2026 — Thème Marketplace intégré · en développement\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Marketplace : thème intégré avec Fira locale, navigation compacte, boutons tactiles, filtres repliables et captures défilantes.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Conservation de `mode=app` dans la navigation, la recherche, les filtres et le changement de langue.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) En-têtes du site masqués en mode intégré. Confirmations gérées par Gaia, sans privilèges supplémentaires pour le catalogue.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) 16 pages FR/EN, 2 pages classiques et affichages mobiles à 320 et 360 pixels vérifiés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Thème prêt localement, non déployé. Lanceurs PC et Sargo mis à jour ; intégration Android au prochain APK.\n", - "en": "## 6 October 2026 — Embedded Marketplace theme · in development\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Marketplace: embedded theme with local Fira fonts, compact navigation, touch controls, collapsible filters and scrolling screenshots.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Preserve `mode=app` across navigation, search, filters and language changes.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Hide website headers in embedded mode. Gaia handles confirmations; the catalogue receives no extra privileges.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Checked 16 French/English pages, 2 standard pages and mobile layouts at 320 and 360 pixels.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Theme ready locally, not deployed. Desktop and Sargo launchers updated; Android integration pending the next APK.\n" + "fr": "## 06/10/2026 : Thème Marketplace\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Intégration prévue dans un prochain APK.\n\n### ![Web](https://img.shields.io/badge/Web-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Thème intégré : police Fira, navigation compacte, boutons tactiles et captures défilantes.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Affichage intégré conservé pendant la recherche, les filtres et les changements de langue.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Thème préparé localement, pas encore déployé sur le site.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Affichage](https://img.shields.io/badge/Affichage-475569?style=flat-square) : Pages françaises et anglaises vérifiées sur petits écrans.\n", + "en": "## 06/10/2026 : Marketplace theme\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Integration planned for a future APK.\n\n### ![Web](https://img.shields.io/badge/Web-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Embedded theme: Fira font, compact navigation, touch buttons and scrollable screenshots.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Embedded display preserved during search, filtering and language changes.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Theme prepared locally, not yet deployed to the website.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Display](https://img.shields.io/badge/Display-475569?style=flat-square) : French and English pages checked on small screens.\n" }, "metadata": { "kind": "history", "status": "history", "platforms": [ - "pc", "apk", - "models" + "web" ], - "models": [ - "sargo" - ] + "models": [] } }, { "id": "development-2026-10-06-system-banner", "text": { - "fr": "## 6 octobre 2026 — Bandeaux Gaia · en développement\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Fermeture automatique du bandeau « Application installée », même sans événement de fin d’animation.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Annulation des anciens délais lorsqu’un nouveau bandeau remplace le précédent.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : affichage, expiration, remplacement et fermeture au clic vérifiés. Sargo : disparition après cinq secondes vérifiée en RAM.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Correctif disponible dans les sources communes pour le prochain APK. Aucun flash ni publication.\n", - "en": "## 6 October 2026 — Gaia banners · in development\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Automatically dismiss the “Application installed” banner even without an animation-end event.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Cancel old timers when a new banner replaces the previous one.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: checked display, expiry, replacement and click dismissal. Sargo: verified dismissal after five seconds in RAM.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Fix available in shared sources for the next APK. No flash or release.\n" + "fr": "## 06/10/2026 : Bandeaux de notification\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Le bandeau « Application installée » disparaît automatiquement et se remplace correctement.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Affichage et fermeture des bandeaux vérifiés.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Correctif préparé pour le prochain APK.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Disparition du bandeau après cinq secondes vérifiée.\n", + "en": "## 06/10/2026 : Notification banners\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : The “Application installed” banner disappears automatically and is replaced correctly.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Banner display and dismissal checked.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Fix prepared for the next APK.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Banner disappearance after five seconds checked.\n" }, "metadata": { "kind": "history", @@ -350,8 +365,8 @@ { "id": "development-2026-10-06-wifi", "text": { - "fr": "## 6 octobre 2026 — Wi-Fi et panneaux Paramètres · en développement\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Paramètres : ouverture des panneaux même sans événement de fin d’animation, sans double initialisation.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : événements Wi-Fi corrigés pour rétablir l’affichage des réseaux et signaler correctement la déconnexion.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : quatre points d’accès détectés, regroupés en deux réseaux. Connexion confirmée et requête HTTPS réussie avec certificats vérifiés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sources communes, serveur PC et essai Sargo en RAM mis à jour. Correctifs non inclus dans l’APK public.\n", - "en": "## 6 October 2026 — Wi-Fi and Settings panels · in development\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Settings: open panels even without an animation-end event, without duplicate initialization.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: corrected Wi-Fi events to restore network results and report disconnection properly.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: detected four access points grouped into two networks. Connection confirmed and HTTPS request passed with certificate verification.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Shared sources, desktop server and Sargo RAM trial updated. Fixes not included in the public APK.\n" + "fr": "## 06/10/2026 : Wi-Fi et paramètres\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Paramètres](https://img.shields.io/badge/Param%C3%A8tres-475569?style=flat-square) : Ouverture des panneaux rétablie quand une animation ne se termine pas normalement.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Correctifs encore absents de l’APK public.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Réseaux détectés et déconnexions affichés correctement.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Recherche, connexion et accès Internet vérifiés.\n", + "en": "## 06/10/2026 : Wi-Fi and settings\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Settings](https://img.shields.io/badge/Settings-475569?style=flat-square) : Panels open even when an animation does not finish normally.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Fixes not yet included in the public APK.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Detected networks and disconnections displayed correctly.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Search, connection and Internet access checked.\n" }, "metadata": { "kind": "history", @@ -369,8 +384,8 @@ { "id": "development-2026-10-06-marketplace-views", "text": { - "fr": "## 6 octobre 2026 — Marketplace · en développement\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) PC/Sargo : catalogue Marketplace contenu sous la barre de statut, masqué à l’accueil et retiré à la fermeture.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Une navigation annulée ou une ancienne page d’erreur ne masque plus la nouvelle tentative.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Message d’erreur local avec bouton Réessayer lorsque le catalogue est inaccessible.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : navigation, erreur réseau, nouvelle tentative, accueil et fermeture vérifiés.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo en RAM : sept contrôles réussis avec une page locale et déverrouillage forcé. Catalogue distant non validé sans connexion Internet.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview17 local reconstruit ; signature, alignement et ressources vérifiés. Aucun nouveau test sur appareil Android ni publication.\n", - "en": "## 6 October 2026 — Marketplace · in development\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Desktop/Sargo: keep Marketplace below the status bar, hide it on Home and remove it when closed.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Cancelled navigation or an old error page no longer hides a retry.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Local error message with a Retry button when the catalogue is unavailable.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: verified navigation, network errors, retry, Home and closing.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo in RAM: seven checks passed with a local page and forced unlock. Remote catalogue not validated without Internet access.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Rebuilt local Preview17 APK; checked signature, alignment and assets. No new Android device test or release.\n" + "fr": "## 06/10/2026 : Navigation Marketplace\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Message local avec bouton Réessayer si le catalogue est inaccessible.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Le catalogue reste sous la barre de statut et se masque en revenant à l’accueil ou en le fermant.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Navigation](https://img.shields.io/badge/Navigation-475569?style=flat-square) : Une ancienne erreur ne masque plus une nouvelle tentative.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Navigation, erreurs, retour à l’accueil et fermeture vérifiés.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Preview 17 reconstruite localement, sans nouveau test Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Interface testée avec une page locale ; catalogue distant non vérifié sans Internet.\n", + "en": "## 06/10/2026 : Marketplace navigation\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Local message with a Retry button when the catalogue is unavailable.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : The catalogue stays below the status bar and hides when returning home or closing it.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Navigation](https://img.shields.io/badge/Navigation-475569?style=flat-square) : An earlier error no longer hides a new attempt.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Navigation, errors, returning home and closing checked.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Preview 17 rebuilt locally, without a new Android test.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Interface tested with a local page; remote catalogue not checked without Internet.\n" }, "metadata": { "kind": "history", @@ -388,8 +403,8 @@ { "id": "2.7-preview.17", "text": { - "fr": "## 2.7-preview.17 — APK construit · 5 octobre 2026\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Marketplace sur l’accueil, avec son icône originale et le catalogue Vulpes en français ou en anglais.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Installation confirmée des applications ZIP, lancement depuis l’accueil et désinstallation.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Applications installées isolées des sources Gaia et des privilèges système.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : parcours complet avec 2048 et contrôles des archives, chemins, limites, annulations et confirmations à usage unique.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview17 construit et signé avec Marketplace, GeckoView et stockage privé des paquets.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Émulateur Android 16/API 36 : installation, lancement, isolation, conservation après redémarrage de l’application et désinstallation de 2048.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo en RAM le 6 octobre : accueil et ressources Marketplace vérifiés, 9 contrôles système sur 10 réussis. Variation du viewport au déverrouillage ; installation de paquets à valider.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Prise en charge initiale des applications web empaquetées. Anciennes API privilégiées et applications hébergées non restaurées. Aucune publication à cette étape.\n", - "en": "## 2.7-preview.17 — APK built · 5 October 2026\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Marketplace on Home with its original icon and the Vulpes catalogue in French or English.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Confirmed ZIP app installation, launch from Home and removal.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Installed apps isolated from Gaia sources and system privileges.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: full 2048 workflow plus archive, path, limit, cancellation and single-use confirmation checks.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview17 APK built and signed with Marketplace, GeckoView and private package storage.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Android 16/API 36 emulator: 2048 installation, launch, isolation, persistence after app restart and removal.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo in RAM on October 6: Home and Marketplace assets verified, 9 of 10 system checks passed. Viewport changes on unlock; package installation awaits validation.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Initial support for packaged web apps. Legacy privileged APIs and hosted apps not restored. No release at this stage.\n" + "fr": "## 05/10/2026 : 2.7-preview.17\n\n![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Installation, lancement et désinstallation d’applications web empaquetées.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Catalogue Vulpes sur l’accueil, en français et en anglais, avec son icône originale.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Sécurité](https://img.shields.io/badge/S%C3%A9curit%C3%A9-475569?style=flat-square) : Applications installées séparées des applications système.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Compatibilité](https://img.shields.io/badge/Compatibilit%C3%A9-475569?style=flat-square) : Certaines anciennes applications et API Firefox OS ne sont pas encore prises en charge.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Installation et utilisation de 2048 vérifiées.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : 2048 installé, conservé après redémarrage et désinstallé sur un émulateur Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Accueil vérifié ; installation d’applications encore à valider sur le Pixel.\n", + "en": "## 05/10/2026 : 2.7-preview.17\n\n![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : Install, launch and uninstall packaged web apps.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Vulpes catalogue on the home screen, in French and English, with its original icon.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Security](https://img.shields.io/badge/Security-475569?style=flat-square) : Installed apps kept separate from system apps.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Compatibility](https://img.shields.io/badge/Compatibility-475569?style=flat-square) : Some old Firefox OS apps and APIs are not yet supported.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Installation and use of 2048 checked.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : 2048 installed, preserved after restart and uninstalled on an Android emulator.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Marketplace](https://img.shields.io/badge/Marketplace-475569?style=flat-square) : Home screen checked; app installation still needs validation on Pixel.\n" }, "metadata": { "kind": "version", @@ -407,8 +422,8 @@ { "id": "2.7-preview.16", "text": { - "fr": "## 2.7-preview.16 — APK construit · 5 octobre 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sélecteurs Gaia de fond d’écran et de sons rétablis, avec retour vers Paramètres et annulation par Accueil.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Changement de langue appliqué à l’accueil et conservé après redémarrage.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Arrêt du balayage horizontal sur chaque page ; applications de développement masquées sur l’accueil.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Logo Vulpes au démarrage et liste des sons adaptée au moteur actuel. Transport des médias partagé entre PC et Android.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android : verrouillage Gaia après veille et retour depuis la caméra du verrouillage. Mode lanceur HOME validé.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Android : barres système masquées en mode immersif, accessibles par balayage. APK Preview16 construit et signé.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC et émulateur Android 16/API 36 : fonds d’écran, sons et panneaux vérifiés ; langue, verrouillage et persistance du fond testés sur Android.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : image de démarrage mise à jour pour ne plus restaurer d’anciens fichiers.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo en RAM : 6 contrôles d’interface et 10 contrôles système réussis. Installation conservée en Preview15, sans flash.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) APK non publié. Installation FFAA et audio d’appel à valider ; le choix d’un son Gaia ne change pas la sonnerie Android.\n", - "en": "## 2.7-preview.16 — APK built · 5 October 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Restored Gaia wallpaper and sound pickers, return to Settings and cancellation through Home.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Apply language changes to Home and preserve them after restart.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Restore horizontal page snapping; hide development apps on Home.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Vulpes startup logo and sound list adapted to the current engine. Media transport shared by desktop and Android.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android: Gaia locking after sleep and Back from the lockscreen camera. HOME launcher mode validated.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Android: hide system bars in immersive mode, with swipe access. Preview16 APK built and signed.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop and Android 16/API 36 emulator: checked wallpapers, sounds and panels; tested language, locking and wallpaper persistence on Android.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: updated the boot image to stop restoring outdated files.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo in RAM: 6 UI and 10 system checks passed. Installed build remains Preview15, without flashing.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) APK not published. FFAA installation and call audio await validation; Gaia sound selection does not change the Android ringtone.\n" + "fr": "## 05/10/2026 : 2.7-preview.16\n\n![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Logo Vulpes au démarrage.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Accueil](https://img.shields.io/badge/Accueil-475569?style=flat-square) : Défilement horizontal involontaire supprimé ; applications de test masquées.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Personnalisation](https://img.shields.io/badge/Personnalisation-475569?style=flat-square) : Choix des fonds d’écran et des sons rétabli. Langue appliquée à l’accueil et conservée au redémarrage.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : APK construit, non publié ; image Pixel essayée sans installation permanente.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Barres Android masquées, accessibles par balayage ; mode lanceur vérifié.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Verrouillage](https://img.shields.io/badge/Verrouillage-475569?style=flat-square) : Retour après veille et depuis la caméra du verrouillage corrigé.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Les anciens fichiers ne remplacent plus les mises à jour au démarrage.\n", + "en": "## 05/10/2026 : 2.7-preview.16\n\n![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Vulpes startup logo.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Home](https://img.shields.io/badge/Home-475569?style=flat-square) : Unwanted horizontal scrolling removed; test apps hidden.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Customization](https://img.shields.io/badge/Customization-475569?style=flat-square) : Wallpaper and sound selection restored. Home screen language applied and preserved after restart.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : APK built, not published; Pixel image tried without permanent installation.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Android bars hidden and accessible by swiping; launcher mode checked.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Lock screen](https://img.shields.io/badge/Lock%20screen-475569?style=flat-square) : Return from sleep and the lock screen camera fixed.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Old files no longer overwrite updates at startup.\n" }, "metadata": { "kind": "version", @@ -426,15 +441,13 @@ { "id": "2026-10-04-sargo-standalone", "text": { - "fr": "## En développement — 4 octobre 2026 — Installation autonome Sargo\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : volume ext4 autonome pour userdata, avec système, données et composants vendor/modem. Installation indépendante de Droidian et d’ADB.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Installateur Fastboot avec contrôles du modèle, du déverrouillage, des tailles et des empreintes. Remplacement de userdata, dtbo_a, vbmeta_a et boot_a ; calibrations conservées.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sauvegarde complète de userdata et archive de restauration vérifiées avant le flash. Restauration réelle non testée.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Deux démarrages installés réussis : 11 contrôles Gaia et 10 contrôles natifs par démarrage, réglages conservés et boot relu conforme.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Variante sans SSH ni clés de maintenance démarrée après flash. Variante de développement réinstallée ; caméra, clavier et notifications vérifiés.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Paquet Fastboot local assemblé ; 44 tests ciblés réussis.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Paquet non publié : provenance et redistribution de composants matériels à finaliser. Essais sur un seul Pixel 3a ; volume de 8 Gio dont 1 Gio modifiable, sans extension automatique.\n", - "en": "## In development — 4 October 2026 — Standalone Sargo installation\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: standalone ext4 userdata volume with system, data and vendor/modem components. Installation independent of Droidian and ADB.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Fastboot installer with model, unlock, size and checksum checks. Replaces userdata, dtbo_a, vbmeta_a and boot_a; retains calibration.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Full userdata backup and recovery archive verified before flashing. Actual restoration not tested.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Two installed boots passed: 11 Gaia and 10 native checks per boot, retained settings and matching boot readback.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Variant without SSH or maintenance keys booted after flashing. Development variant reinstalled; camera, keyboard and notifications checked.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Local Fastboot package assembled; 44 targeted tests passed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Package unpublished: hardware component provenance and redistribution pending. Tested on one Pixel 3a; 8 GiB volume with 1 GiB writable, without automatic expansion.\n" + "fr": "## 04/10/2026 : Installation autonome\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Installateur avec vérification du modèle et des fichiers avant écriture.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Installation autonome de Vulpes, sans passer par Droidian.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Paquet non publié ; un seul Pixel testé. L’installation remplace les données du téléphone.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Secours](https://img.shields.io/badge/Secours-475569?style=flat-square) : Sauvegardes vérifiées ; restauration complète encore à essayer.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Démarrages installés, conservation des réglages, caméra, clavier et notifications vérifiés.\n", + "en": "## 04/10/2026 : Standalone installation\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Installer with device and file checks before writing.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Standalone Vulpes installation without going through Droidian.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Package not published; tested on one Pixel only. Installation replaces phone data.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Recovery](https://img.shields.io/badge/Recovery-475569?style=flat-square) : Backups checked; full restoration still needs testing.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Installed boots, saved settings, camera, keyboard and notifications checked.\n" }, "metadata": { "kind": "development", "status": "development", "platforms": [ - "pc", - "apk", "models" ], "models": [ @@ -445,15 +458,13 @@ { "id": "2026-10-03-sargo-per-device-installation", "text": { - "fr": "## En développement — 3 octobre 2026 — Installation Sargo par appareil\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : dossier appareil portable pour les builds, l’installation et le secours, indépendant de l’inventaire du Pixel de développement.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Collecte en lecture seule des six partitions de démarrage et du stockage, liée à l’identité du téléphone. Sauvegardes privées.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Transfert SSH avec contrôle d’identité, du stockage et des empreintes, sans écrasement, formatage ni flash.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Deux boots RAM : 11 contrôles Gaia et 10 contrôles natifs réussis chacun ; réglage conservé. Timeout autofocus au premier essai, caméra fonctionnelle au second.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Retour au build installé vérifié ; boot inchangé et écrasement des données refusé.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Timeout autofocus non déclaré corrigé. Provenance exacte du HAL encore à établir ; noyau et stockage ext4/LVM compatibles requis, sans installation directe depuis Android d’origine.\n", - "en": "## In development — 3 October 2026 — Per-device Sargo installation\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: portable device workspace for builds, installation and recovery, independent of the development Pixel inventory.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Read-only collection of six boot partitions and storage, bound to the phone identity. Private backups.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) SSH transfer with identity, storage and checksum checks, without overwriting, formatting or flashing.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Two RAM boots: 11 Gaia and 10 native checks passed each; setting retained. Autofocus timed out on the first trial; camera worked on the second.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Return to the installed build verified; boot unchanged and data overwrite rejected.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Autofocus timeout not considered fixed. Exact HAL provenance still pending; qualified kernel and compatible ext4/LVM storage required, without direct installation from stock Android.\n" + "fr": "## 03/10/2026 : Installation par appareil\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Préparation adaptée à chaque Pixel, avec sauvegardes propres à l’appareil.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Mise au point parfois trop lente ; problème encore ouvert.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Installation directe depuis Android d’origine pas encore disponible.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Démarrages temporaires, conservation des réglages et retour à l’installation précédente vérifiés.\n", + "en": "## 03/10/2026 : Per-device installation\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Preparation adapted to each Pixel, with device-specific backups.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Focus sometimes times out; issue still open.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Direct installation from stock Android not yet available.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Temporary boots, saved settings and return to the previous installation checked.\n" }, "metadata": { "kind": "development", "status": "development", "platforms": [ - "pc", - "apk", "models" ], "models": [ @@ -464,16 +475,15 @@ { "id": "2026-10-03-sargo-installation-tools", "text": { - "fr": "## En développement — 3 octobre 2026 — Préparation et secours Sargo\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : préparation locale des paquets avec contrôles d’empreintes, décompression bornée, vérification ext4 et création de données vierges sans écrasement.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Kit de secours privé avec sauvegarde de boot_a et contrôles du modèle, du numéro de série, du slot et des empreintes. Données utilisateur non incluses.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Restauration possible sans l’image de diagnostic.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Construction système : référence matérielle ARM64 complète exigée.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Archive système préparée et kit de secours vérifié localement. Installation sur un autre Sargo à finaliser ; aucun flash ni ROM publiée.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Journal JSON inclus dans les prochaines publications de sources ; documents de travail exclus.\n", - "en": "## In development — 3 October 2026 — Sargo preparation and recovery tools\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: local package preparation with checksum checks, bounded extraction, ext4 validation and fresh data creation without overwriting.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Private recovery kit with boot_a backup and model, serial, slot and checksum checks. User data not included.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Restoration works without the diagnostic image.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) System builds require a complete ARM64 hardware reference.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) System archive prepared and recovery kit checked locally. Installation on another Sargo pending; no flash or ROM release.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) JSON changelog included in future source releases; working documents excluded.\n" + "fr": "## 03/10/2026 : Installation et secours\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Préparation des paquets et kit de secours avec sauvegarde du démarrage.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Secours](https://img.shields.io/badge/Secours-475569?style=flat-square) : Restauration possible sans démarrer l’outil de diagnostic.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Préparation vérifiée localement ; installation sur un autre Pixel encore à finaliser.\n\n### ![Web](https://img.shields.io/badge/Web-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Changelog](https://img.shields.io/badge/Changelog-475569?style=flat-square) : Historique commun inclus dans les prochaines publications de sources.\n", + "en": "## 03/10/2026 : Installation and recovery\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Package preparation and recovery kit with a boot backup.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Recovery](https://img.shields.io/badge/Recovery-475569?style=flat-square) : Restoration possible without booting the diagnostic tool.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Preparation checked locally; installation on another Pixel still needs completion.\n\n### ![Web](https://img.shields.io/badge/Web-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Changelog](https://img.shields.io/badge/Changelog-475569?style=flat-square) : Shared history included in upcoming source releases.\n" }, "metadata": { "kind": "development", "status": "development", "platforms": [ - "pc", - "apk", - "models" + "models", + "web" ], "models": [ "sargo" @@ -483,15 +493,13 @@ { "id": "2026-10-03-sargo-modem-persistence", "text": { - "fr": "## En développement — 3 octobre 2026 — Sargo : récupération modem et installation vierge\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : cache des polices et création du dossier privé oFono au premier démarrage corrigés dans l’image système.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Récupération du modem sans redémarrer le téléphone. Réenregistrement réseau mesuré à environ 22 secondes lors d’un essai contrôlé.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Profil neuf : Gaia, rendu matériel, Fira, deux caméras, focus, zoom, clavier et notifications vérifiés. Scan Wi-Fi fonctionnel après redémarrage du modem.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Deux démarrages avec conservation des réglages dans un espace de données séparé. Installation existante préservée.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Cause du watchdog IMS non corrigée. Paquet public d’installation et de restauration encore incomplet ; aucune image publiée.\n", - "en": "## In development — 3 October 2026 — Sargo modem recovery and fresh installation\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: corrected font cache and first-boot creation of oFono’s private directory in the system image.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Modem recovery without rebooting the phone. Network registration took about 22 seconds in a controlled trial.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Fresh profile: checked Gaia, hardware rendering, Fira, both cameras, focus, zoom, keyboard and notifications. Wi-Fi scan worked after modem restart.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Two boots retained settings in a separate data image. Existing installation preserved.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) IMS watchdog root cause unresolved. Public installation and recovery package still incomplete; no image released.\n" + "fr": "## 03/10/2026 : Modem et premier démarrage\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Réseau](https://img.shields.io/badge/R%C3%A9seau-475569?style=flat-square) : Récupération du modem sans redémarrer tout le téléphone.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Polices et initialisation du modem corrigées sur une installation neuve.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Redémarrages intermittents du modem encore à résoudre ; paquet public incomplet.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Caméras, focus, zoom, clavier, notifications et recherche Wi-Fi vérifiés.\n", + "en": "## 03/10/2026 : Modem and first startup\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Network](https://img.shields.io/badge/Network-475569?style=flat-square) : Recover the modem without restarting the whole phone.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Fonts and modem initialization fixed on a fresh installation.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : Intermittent modem restarts still need fixing; public package incomplete.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Cameras, focus, zoom, keyboard, notifications and Wi-Fi search checked.\n" }, "metadata": { "kind": "development", "status": "development", "platforms": [ - "pc", - "apk", "models" ], "models": [ @@ -502,14 +510,13 @@ { "id": "2026-10-01-sargo-distribution-preparation", "text": { - "fr": "## 1er octobre 2026 — Sargo : préparation de la distribution — en développement\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : image Preview15 reconstruite avec profils vierges, licences et inventaire des 493 paquets. Documents de travail exclus.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Table de montage générée depuis l’inventaire du stockage. Prise en charge limitée à une seule étendue ext4 sur userdata.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Droits du cache des polices au premier démarrage : fc-cache exécuté avec le compte de session.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Contrôles ext4, contenu et transfert réussis. Essais RAM sans écriture de boot_a ; retour au build v59 vérifié.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) SIM, LTE, scan Wi-Fi, Gaia, rendu matériel, Fira, caméras, clavier et notifications vérifiés en RAM.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Récupération ciblée après identification d’un redémarrage intermittent du firmware IMS. Second démarrage réussi ; nouveau crash IMS non testé.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Qualification de l’image incomplète, sans validation des appels, SMS ou données mobiles de bout en bout. Image non publiée et non flashable.\n", - "en": "## October 1, 2026 — Sargo distribution preparation — in development\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: rebuilt Preview15 image with empty profiles, licenses and an inventory of 493 packages. Working documents excluded.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Mount table generated from the storage inventory. Support limited to a single ext4 extent on userdata.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) First-boot font cache permissions: run fc-cache as the session user.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Filesystem, content and transfer checks passed. RAM trials left boot_a unchanged; return to v59 verified.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) SIM, LTE, Wi-Fi scan, Gaia, hardware rendering, Fira, cameras, keyboard and notifications checked in RAM.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Targeted recovery after tracing intermittent reboots to IMS firmware. Second boot passed; recovery from another IMS crash not tested.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Image qualification incomplete; end-to-end calls, SMS and mobile data unvalidated. Image unpublished and non-flashable.\n" + "fr": "## 01/10/2026 : Préparation de la distribution\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Préparation d’une image avec des données vierges.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Polices](https://img.shields.io/badge/Polices-475569?style=flat-square) : Affichage des polices au premier démarrage corrigé.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Image non publiée. Appels, SMS et données mobiles encore à vérifier de bout en bout.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Redémarrage intermittent du modem identifié.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : SIM, 4G, recherche Wi-Fi, caméras, clavier et notifications vérifiés en démarrage temporaire.\n", + "en": "## 01/10/2026 : Preparing distribution\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Preparation of an image with clean user data.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Fonts](https://img.shields.io/badge/Fonts-475569?style=flat-square) : Font display on first boot fixed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Image not published. Calls, SMS and mobile data still need end-to-end testing.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : Intermittent modem restart identified.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : SIM, 4G, Wi-Fi search, cameras, keyboard and notifications checked in a temporary boot.\n" }, "metadata": { "kind": "history", "status": "history", "platforms": [ - "pc", "models" ], "models": [ @@ -520,8 +527,8 @@ { "id": "2.7-preview.15", "text": { - "fr": "## 2.7-preview.15 — 30 septembre 2026 — publiée\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Première publication des sources PC, Android et Tundra, avec README FR/EN, licences et scripts de préparation. Fichiers privés exclus.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS : dates des bulles et états d’envoi/échec corrigés. Libération et remplacement des flux caméra fiabilisés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) PC : tests de navigation stabilisés, délai de démarrage à froid ajusté et fermeture propre après dépassement du délai Gaia.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC avec Gecko 156.0.1 : 42 tests de services, démarrage, navigation, réglages, gestes, historique, isolation et persistance vérifiés.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview15 signé avec la clé précédente et GeckoView 156.0 ; parité des ressources vérifiée.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Émulateur Android 16 : mise à jour, Photo/Galerie, reprise caméra, dix retours d’arrière-plan et récupération du rendu validés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo : sources incluses, build privé v59 conservé. Aucune ROM générique ; démarrage lié au stockage et aux images préinstallées.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo : aperçu proche de 16 i/s ; flash, vidéo, rotation et veille profonde incomplets. Audio d’appel et dialogue après envoi SMS à examiner.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.15)\n", - "en": "## 2.7-preview.15 — 30 September 2026 — published\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) First publication of desktop, Android and Tundra sources, with French/English READMEs, licenses and setup scripts. Private files excluded.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS: corrected bubble dates and sent/failed states. Improved camera stream cleanup and replacement.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Desktop: stabilized navigation checks, adjusted cold-start timeout and clean shutdown after Gaia times out.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop with Gecko 156.0.1: 42 service tests, startup, navigation, settings, gestures, history, isolation and persistence checked.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview15 APK signed with the previous key and GeckoView 156.0; asset parity verified.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Android 16 emulator: validated update, Camera/Gallery, camera resume, ten background returns and renderer recovery.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo: sources included, private v59 retained. No generic ROM; boot depends on storage layout and preinstalled images.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo: preview around 16 fps; flash, video, rotation and deep suspend incomplete. Call audio and the dialog after SMS sending need investigation.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.15)\n" + "fr": "## 30/09/2026 : 2.7-preview.15\n\n![Publié](https://img.shields.io/badge/Publi%C3%A9-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Sources](https://img.shields.io/badge/Sources-475569?style=flat-square) : Première publication des sources PC, Android et Tundra, avec présentation FR/EN.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Arrêt et remplacement du flux caméra fiabilisés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Dates et états d’envoi corrigés dans les conversations.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Navigation, réglages, gestes et conservation des données vérifiés.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Mise à jour, Photo, Galerie et retours d’arrière-plan vérifiés sur un émulateur Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Sources incluses ; installation universelle encore indisponible à cette étape.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Flash, vidéo, rotation, veille et audio d’appel encore incomplets ou à vérifier.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.15)\n", + "en": "## 30/09/2026 : 2.7-preview.15\n\n![Published](https://img.shields.io/badge/Published-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Source code](https://img.shields.io/badge/Source%20code-475569?style=flat-square) : First publication of Desktop, Android and Tundra source code, with French/English project overviews.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : More reliable camera stream shutdown and replacement.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Dates and sending statuses fixed in conversations.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : Navigation, settings, gestures and saved data checked.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : Update, Camera, Gallery and returns from the background checked on an Android emulator.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Source code included; universal installation still unavailable at this stage.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Flash, video, rotation, sleep and call audio still incomplete or awaiting tests.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.15)\n" }, "metadata": { "kind": "version", @@ -539,8 +546,8 @@ { "id": "development-2026-09-30-sms-camera-followup", "text": { - "fr": "## En développement — retours SMS et caméra · 30 septembre 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS : conversion des dates pour corriger les conversations vides.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Caméra : fermeture des flux et libération du capteur corrigées ; une ancienne session ne peut plus fermer la suivante.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : arrêt physique du vibreur via DRV2624, avec coupure de secours au démarrage et à l’arrêt du service.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : composition et affichage des SMS vérifiés avec modem simulé. Sargo : bascules caméra et arrêt du capteur testés sur deux boots RAM.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v54 : focus, zoom et SMS dans les deux sens confirmés par l’utilisateur. Cinq conversations affichées ; arrêt du vibreur confirmé.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo v59 installé sur boot_a après deux boots RAM ; démarrage, relecture et slot A vérifiés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Dialogue après envoi SMS et fluidité caméra encore à traiter. Sources communes mises à jour, sans nouvel APK.\n", - "en": "## In development — SMS and camera feedback · 30 September 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS: convert dates to fix empty conversations.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera: corrected stream and sensor cleanup; an old session can no longer close its replacement.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: physical vibration shutdown through DRV2624, with a safeguard at service startup and exit.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: SMS composition and display checked with a simulated modem. Sargo: camera switching and shutdown tested over two RAM boots.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v54: user confirmed focus, zoom and two-way SMS. Five conversations displayed; vibration shutdown confirmed.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo v59 installed on boot_a after two RAM boots; startup, readback and slot A verified.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Post-SMS dialog and camera smoothness still pending. Shared sources updated, without a new APK.\n" + "fr": "## 30/09/2026 : Retours SMS et caméra\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Libération du capteur et changement de caméra corrigés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Conversations vides corrigées.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Sources communes mises à jour, sans nouvel APK.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Arrêt du vibreur rétabli.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![À suivre](https://img.shields.io/badge/%C3%80%20suivre-475569?style=flat-square) : Dialogue après envoi SMS et fluidité caméra encore à corriger.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Focus et zoom confirmés par l’utilisateur.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Envoi et réception confirmés par l’utilisateur ; conversations affichées.\n", + "en": "## 30/09/2026 : SMS and camera follow-up\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Camera release and switching fixed.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Empty conversations fixed.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Shared sources updated, without a new APK.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Vibration now stops correctly.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Remaining work](https://img.shields.io/badge/Remaining%20work-475569?style=flat-square) : Dialog after sending SMS and camera smoothness still need fixing.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Focus and zoom confirmed by the user.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Sending and receiving confirmed by the user; conversations displayed.\n" }, "metadata": { "kind": "development", @@ -558,8 +565,8 @@ { "id": "development-2026-09-30-sms-camera", "text": { - "fr": "## En développement — SMS et Photo · 30 septembre 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) PC/Tundra : conservation des SMS après refus du modem et transmission des états envoi, échec et envoyé à Gaia.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : états SMS persistants après disparition de l’objet oFono ; envoi refusé si le modem n’est pas enregistré.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : focus tactile, zoom numérique et capture JPEG du capteur dans Photo Gaia.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Photos mesurées : 4032 × 3024 à l’arrière, 3264 × 2448 à l’avant. Aperçu 640 × 480 ; focus avant fixe.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Caméra native : données binaires séparées des traces HAL, réponses bornées et reprise de l’aperçu après capture ou erreur de focus.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : échec d’envoi visible et parcours Photo/Galerie vérifiés. Sargo v54 : deux boots RAM puis installation, persistance et caméra validées.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Réseau instable ; aucune livraison SMS de bout en bout confirmée dans cette passe. Confirmation modem distincte de l’accusé de réception. APK public inchangé (Preview14).\n", - "en": "## In development — Messages and Camera · 30 September 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Desktop/Tundra: retain SMS after modem rejection and pass sending, failed and sent states to Gaia.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: persist SMS states after the oFono object disappears; reject sending when the modem is unregistered.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: touch focus, digital zoom and sensor JPEG capture in Gaia Camera.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Measured photos: 4032 × 3024 rear, 3264 × 2448 front. Preview 640 × 480; fixed front focus.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Native camera: separate binary data from HAL logs, bound responses and resume preview after capture or focus errors.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: checked visible send failures and Camera/Gallery workflows. Sargo v54: validated two RAM boots, installation, persistence and camera.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Unstable network; no end-to-end SMS delivery confirmed in this pass. Modem confirmation is not a delivery receipt. Public APK unchanged (Preview14).\n" + "fr": "## 30/09/2026 : SMS et photo\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Messages en échec conservés et états d’envoi mis à jour.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : APK Preview 14 inchangé à cette étape.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Mise au point au toucher et zoom numérique. Photos jusqu’à 12 Mpx à l’arrière et 8 Mpx à l’avant.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Retour de l’aperçu après une photo corrigé.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Réception par le destinataire non encore confirmée.\n", + "en": "## 30/09/2026 : SMS and photos\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Failed messages preserved and sending statuses updated.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Preview 14 APK unchanged at this stage.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Tap to focus and digital zoom. Photos up to 12 MP at the rear and 8 MP at the front.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Preview return after taking a photo fixed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Delivery to the recipient not yet confirmed.\n" }, "metadata": { "kind": "development", @@ -577,8 +584,8 @@ { "id": "2.7-preview.14", "text": { - "fr": "## 2.7-preview.14 — APK publié · 30 septembre 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Informations système : alignement des versions et polices Fira dans les composants Shadow DOM.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) PC/Tundra : taille des touches en portrait, curseur dans le champ actif et réponses de saisie obsolètes.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) PC/Tundra : pont clavier Gaia et pavé numérique pour les destinataires SMS. Clavier Android inchangé.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Verrouillage : redimensionnement sans fenêtre clavier. Notifications silencieuses respectées, y compris après restauration.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : notifications persistantes dans le volet et sur le verrouillage, avec ouverture de l’application concernée.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : vibrations annulables, limitées à dix secondes ; profils Wi-Fi privés persistants, reconnexion automatique et oubli du réseau.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : stockage des SMS entrants avant acquittement, dédoublonnage et création du dossier d’état.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : commandes écouteur/haut-parleur, micro muet et volume d’appel. Bascule, sourdine et volume testés hors appel.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Installation : flash des images de diagnostic avec débogueur refusé. Sargo v48 installé après deux boots RAM ; persistance, relecture et slot A vérifiés.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : Calendrier et clavier vérifiés. Sargo : clavier, notifications et reconnexion Wi-Fi vérifiés ; son des notifications et téléphonie réelle à valider.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview14 signé et publié. Démarrage, versions et polices vérifiés sur émulateur Android 16. Aucune image Sargo publiée.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.14)\n", - "en": "## 2.7-preview.14 — APK published · 30 September 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) System information: version alignment and Fira fonts in Shadow DOM components.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Desktop/Tundra: portrait key sizing, cursor placement in the active field and stale input replies.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Desktop/Tundra: Gaia keyboard bridge and numeric keypad for SMS recipients. Android keeps its system keyboard.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Lockscreen: resize without a keyboard window. Honour silent notifications, including after restoration.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: persistent tray and lockscreen notifications, opening the owning application.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: cancellable vibrations capped at ten seconds; private persistent Wi-Fi profiles, automatic reconnection and network removal.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: store incoming SMS before acknowledgement, remove duplicates and create the state directory.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: earpiece/speaker, microphone mute and call-volume controls. Routing, mute and volume tested outside a call.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Installer: reject flashing diagnostic images with a debugger. Sargo v48 installed after two RAM boots; persistence, readback and slot A verified.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: Calendar and keyboard checked. Sargo: keyboard, notifications and Wi-Fi reconnection checked; notification sound and real telephony await validation.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview14 APK signed and published. Startup, versions and fonts checked on an Android 16 emulator. No Sargo image released.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.14)\n" + "fr": "## 30/09/2026 : 2.7-preview.14\n\n![Publié](https://img.shields.io/badge/Publi%C3%A9-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Polices, informations de version, verrouillage et notifications harmonisés.\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Clavier](https://img.shields.io/badge/Clavier-475569?style=flat-square) : Clavier agrandi, édition de texte et saisie du numéro de destinataire améliorées.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Démarrage et polices vérifiés sur un émulateur Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Arrêt de la vibration corrigé.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Notifications conservées, ouverture de la conversation et doublons corrigés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Réseaux enregistrés, reconnexion et oubli d’un réseau corrigés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Audio](https://img.shields.io/badge/Audio-475569?style=flat-square) : Contrôles audio testés hors appel ; conversation et son des notifications encore à vérifier.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.14)\n", + "en": "## 30/09/2026 : 2.7-preview.14\n\n![Published](https://img.shields.io/badge/Published-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Fonts, version information, lock screen and notifications aligned.\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Keyboard](https://img.shields.io/badge/Keyboard-475569?style=flat-square) : Larger keyboard, improved text editing and recipient number entry.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Startup and fonts checked on an Android emulator.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Notifications](https://img.shields.io/badge/Notifications-475569?style=flat-square) : Vibration stopping fixed.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Notifications preserved, conversation opening and duplicate messages fixed.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Saved networks, reconnection and forgetting a network fixed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Audio](https://img.shields.io/badge/Audio-475569?style=flat-square) : Audio controls tested outside calls; conversation audio and notification sounds still need testing.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.14)\n" }, "metadata": { "kind": "version", @@ -596,8 +603,8 @@ { "id": "2.7-preview.13", "text": { - "fr": "## 2.7-preview.13 — parcours dans les applications · 27 septembre 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Calendrier : sauvegarde des événements avec alarme, remontée des erreurs et exclusion des rappels d’événements supprimés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Notifications : texte vide accepté ; notification refusée non marquée comme livrée. Support natif Tundra encore incomplet.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Galerie : taille des vignettes au démarrage masqué et arrêt des mises à jour après fermeture de l’éditeur.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS : filtres par correspondant, lecture, période et livraison appliqués.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : vidéo WebM, édition et copie de photo, calendrier, lecture et suppression des conversations vérifiés.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Copie isolée : démarrage, tests PC, persistance et empaquetage Android réussis.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview13 construit et signé. Photo/Galerie, Calendrier, dix reprises d’arrière-plan et récupération du rendu validés sur Android 16 émulé.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v40 installé après deux boots RAM ; Gaia, caméra, Wi-Fi, luminosité, commandes et relecture de boot_a vérifiés.\n", - "en": "## 2.7-preview.13 — application workflows · 27 September 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Calendar: save events with alarms, report scheduling errors and skip reminders for deleted events.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Notifications: accept empty text; do not mark rejected notifications as delivered. Native Tundra support still incomplete.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Gallery: thumbnail sizing at hidden startup and cancellation of updates after closing the editor.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS: apply correspondent, read-state, date and delivery filters.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: checked WebM playback, photo editing and copying, calendar, conversation reading and deletion.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Isolated checkout: startup, desktop tests, persistence and Android packaging passed.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview13 APK built and signed. Camera/Gallery, Calendar, ten background returns and renderer recovery validated on emulated Android 16.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v40 installed after two RAM boots; Gaia, camera, Wi-Fi, brightness, controls and boot_a readback verified.\n" + "fr": "## 27/09/2026 : 2.7-preview.13\n\n![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Calendrier](https://img.shields.io/badge/Calendrier-475569?style=flat-square) : Rappels des événements corrigés, y compris après suppression.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Galerie](https://img.shields.io/badge/Galerie-475569?style=flat-square) : Premier affichage et fermeture de l’éditeur corrigés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Filtres des conversations corrigés.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Photo, vidéo, calendrier et conversations vérifiés.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Caméra, Galerie, Calendrier et reprise après arrière-plan vérifiés.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Caméra, Wi-Fi et luminosité vérifiés sur la version installée.\n", + "en": "## 27/09/2026 : 2.7-preview.13\n\n![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Calendar](https://img.shields.io/badge/Calendar-475569?style=flat-square) : Event reminders fixed, including after deletion.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Gallery](https://img.shields.io/badge/Gallery-475569?style=flat-square) : Initial display and closing the editor fixed.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![SMS](https://img.shields.io/badge/SMS-475569?style=flat-square) : Conversation filters fixed.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : Photo, video, calendar and conversations checked.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : Camera, Gallery, Calendar and background resume checked.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Camera, Wi-Fi and brightness checked on the installed version.\n" }, "metadata": { "kind": "version", @@ -615,8 +622,8 @@ { "id": "2.7-preview.12", "text": { - "fr": "## 2.7-preview.12 — revue des applications · 27 septembre 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Icônes Gaia : variantes de 1× à 2,25× restaurées dans 1 047 références CSS.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Photo : changement de capteur après détection et désactivation du zoom de l’interface au pincement. Flash indisponible grisé.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Accueil : appui long et transmission des gestes rétablis, sans privilèges supplémentaires pour les sites web.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Navigateur : page d’accueil locale bilingue, suivant la langue Gaia sans redémarrage.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS : identifiants, migration, dates, événements d’envoi, requêtes multi-destinataires et écritures concurrentes corrigés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Calendrier : libellé d’accessibilité du jour courant rétabli dans 37 langues.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Revue de 14 applications ; 26 contrôles Galerie/Musique/Horloge/UI, tests Contacts/SMS et isolation web.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview12 reconstruit avec les mêmes ressources ; parité vérifiée. Fonctions matérielles adaptées séparément sur Android et Tundra.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo : aperçu caméra NV21 par shader et transport binaire, environ 23 i/s mesurées contre 8 dans l’essai intermédiaire.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : fermeture du worker caméra attendue avant changement de capteur ; luminosité manuelle réglée en environ 200 ms.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : activation Wi-Fi depuis Gaia et connexion WPA-PSK aux réseaux mixtes WPA2/WPA3.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : scan, connexion et HTTPS validés en RAM. v38 installé après deux boots RAM, relecture et slot A vérifiés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo : profils Wi-Fi temporaires ; flash, vidéo, capteurs, Bluetooth, comptage de données et appels avancés incomplets.\n", - "en": "## 2.7-preview.12 — application review · 27 September 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Gaia icons: restored 1× to 2.25× variants across 1,047 CSS references.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera: enable switching after sensor detection and prevent pinch zoom on the UI. Unavailable flash disabled.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Home: restore long press and gesture forwarding without additional privileges for websites.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Browser: local bilingual welcome page following Gaia’s language without restarting.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) SMS: corrected identifiers, migration, dates, sending events, multi-recipient requests and concurrent writes.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Calendar: restored the current-day accessibility label in 37 languages.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Reviewed 14 apps; 26 Gallery/Music/Clock/UI checks, Contacts/SMS tests and web isolation checks.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview12 APK rebuilt with shared assets; parity verified. Hardware features handled separately on Android and Tundra.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Sargo: shader-based NV21 preview and binary transport, about 23 fps measured versus 8 in the intermediate trial.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: wait for camera worker shutdown before switching sensors; manual brightness reaches its target in about 200 ms.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: Wi-Fi power control from Gaia and WPA-PSK connections to mixed WPA2/WPA3 networks.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: scan, connection and HTTPS validated in RAM. v38 installed after two RAM boots, with readback and slot A checks.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo: temporary Wi-Fi profiles; flash, video, sensors, Bluetooth, data counters and advanced call controls incomplete.\n" + "fr": "## 27/09/2026 : 2.7-preview.12\n\n![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Navigateur](https://img.shields.io/badge/Navigateur-475569?style=flat-square) : Page d’accueil locale, en français ou en anglais selon la langue.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Conversations SMS et traductions du Calendrier corrigées.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Changement de capteur et zoom de l’interface corrigés ; flash grisé s’il est indisponible.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Icônes plus nettes, appui long sur Accueil et gestes corrigés.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Aperçu plus fluide, autour de 23 images par seconde lors des essais.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Luminosité plus réactive et connexion Wi-Fi corrigée.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Vidéo, flash, Bluetooth et réglages d’appel avancés encore incomplets.\n", + "en": "## 27/09/2026 : 2.7-preview.12\n\n![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Browser](https://img.shields.io/badge/Browser-475569?style=flat-square) : Local start page, in French or English according to language.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : SMS conversations and Calendar translations fixed.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Camera switching and interface zoom fixed; flash disabled when unavailable.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Sharper icons, long press on Home and gestures fixed.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Smoother preview, at around 23 frames per second in testing.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : More responsive brightness and Wi-Fi connection fixed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Video, flash, Bluetooth and advanced call settings remain incomplete.\n" }, "metadata": { "kind": "version", @@ -634,8 +641,8 @@ { "id": "development-2026-09-27-4", "text": { - "fr": "## En développement — retours Sargo et interface · 27 septembre 2026\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Animation d’arrêt Gaia recolorée en bleu.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Téléphone : en-têtes fixes au changement d’onglet et icônes du journal adaptées aux densités jusqu’à 2,25×.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Texte coupé dans les menus déroulants et débordement du texte d’accueil Vidéo.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Luminosité : valeurs numériques et regroupement des commandes obsolètes, avec ordre veille/réveil préservé.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Accueil : fond sous le dégradé et bouton à droite en paysage, sans recouvrir les applications.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Navigateur : page d’accueil locale modifiable, avec mode privé conservé.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wi-Fi : message d’erreur et bouton Réessayer à la place des relances sans fin.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) APK Preview11 construit et signé ; rotation et position du bouton Accueil vérifiées sur Android 16 émulé.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : aperçu, JPEG et bascules caméra validés en RAM. Capture limitée à 640 × 480 ; flash et vidéo indisponibles.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v33 installé après deux boots RAM ; démarrage, données, relecture et slot A vérifiés. Luminosité et résultats Wi-Fi contrôlés dans Gaia.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : compatibilité PulseAudio 14 et suppression du double chargement des modules audio. Profils appel/média et écouteur testés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo : conversation audio, capture pleine résolution, vidéo et rotation automatique à valider.\n", - "en": "## In development — Sargo feedback and interface · 27 September 2026\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Gaia shutdown animation recoloured blue.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Phone: keep headers fixed when changing tabs and use call-log icons up to 2.25× density.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Clipped dropdown text and overflowing Video welcome text.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Brightness: numeric values and coalesced stale commands, preserving sleep/wake order.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Home: wallpaper under the gradient and right-side button in landscape, without covering apps.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Browser: editable local welcome page, retaining private mode.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wi-Fi: error message and Retry button instead of endless retries.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Preview11 APK built and signed; rotation and Home button placement checked on emulated Android 16.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: preview, JPEG and camera switching validated in RAM. Capture limited to 640 × 480; flash and video unavailable.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v33 installed after two RAM boots; startup, data, readback and slot A verified. Brightness and Wi-Fi results checked in Gaia.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: PulseAudio 14 compatibility and duplicate audio module loading. Call/media profiles and earpiece tested.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Sargo: call audio, full-resolution capture, video and automatic rotation await validation.\n" + "fr": "## 27/09/2026 : Interface et matériel\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Navigateur](https://img.shields.io/badge/Navigateur-475569?style=flat-square) : Première page d’accueil locale.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Extinction](https://img.shields.io/badge/Extinction-475569?style=flat-square) : Animation d’extinction conservée, avec des ronds bleus.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Textes des listes et de Vidéo corrigés ; barre Accueil transparente et adaptée au paysage.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Téléphone](https://img.shields.io/badge/T%C3%A9l%C3%A9phone-475569?style=flat-square) : En-têtes et icônes du journal d’appel corrigés.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Luminosité](https://img.shields.io/badge/Luminosit%C3%A9-475569?style=flat-square) : Réglage de la luminosité raccordé.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Appels audio, vidéo, pleine résolution photo et rotation encore à vérifier.\n", + "en": "## 27/09/2026 : Interface and hardware\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Browser](https://img.shields.io/badge/Browser-475569?style=flat-square) : First local start page.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Shutdown](https://img.shields.io/badge/Shutdown-475569?style=flat-square) : Original shutdown animation retained, with blue circles.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : List and Video text fixed; transparent Home bar adapted to landscape.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Phone](https://img.shields.io/badge/Phone-475569?style=flat-square) : Call history headers and icons fixed.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Brightness](https://img.shields.io/badge/Brightness-475569?style=flat-square) : Brightness adjustment connected.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Call audio, video, full-resolution photos and rotation still need testing.\n" }, "metadata": { "kind": "development", @@ -653,14 +660,13 @@ { "id": "development-2026-09-27-3", "text": { - "fr": "## En développement — stabilité Wi-Fi native · 27 septembre 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wi-Fi : intervalle de recherche rétabli à 20 secondes et regroupement des scans simultanés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : un seul scan matériel à la fois, avec cache court et invalidation à la connexion/déconnexion. Corrige l’épuisement mémoire des builds v21/v22.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Tests de rafales, erreurs et temporisation Wi-Fi.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Version commune Preview9, Gaia 2.7.0 ; nouvel APK avec les mêmes sources. Wi-Fi Android toujours géré par Android.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v25 : deux boots RAM puis installation, 11 contrôles Gaia et 10 système réussis, sans arrêt de processus par manque de mémoire.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Verrouillage, polices, batterie, date et Wi-Fi vérifiés ; veille/réveil et volume testés par événements injectés. Données, relecture et slot A contrôlés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Caméra native et validation complète des appels encore à terminer.\n", - "en": "## In development — native Wi-Fi stability · 27 September 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wi-Fi: restore the 20-second scan interval and coalesce concurrent scans.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: one hardware scan at a time, with a short cache cleared on connect/disconnect. Fixes memory exhaustion in v21/v22.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Wi-Fi burst, failure and timer tests.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Shared Preview9 version, Gaia 2.7.0; new APK with the same sources. Android still manages its own Wi-Fi.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v25: two RAM boots then installation, 11 Gaia and 10 system checks passed, without low-memory process kills.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Checked locking, fonts, battery, date and Wi-Fi; tested sleep/wake and volume with injected events. Data, readback and slot A verified.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Native camera and full call validation still pending.\n" + "fr": "## 27/09/2026 : Stabilité Wi-Fi\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Preview 9 construite avec les corrections communes ; Wi-Fi géré par Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Recherche des réseaux stabilisée pour éviter les blocages du téléphone.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Caméra et appels encore incomplets.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Verrouillage, polices, date, batterie et Wi-Fi vérifiés.\n", + "en": "## 27/09/2026 : Wi-Fi stability\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Preview 9 built with shared fixes; Wi-Fi handled by Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Network discovery stabilized to avoid phone freezes.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Camera and calls remain incomplete.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Lock screen, fonts, date, battery and Wi-Fi checked.\n" }, "metadata": { "kind": "development", "status": "development", "platforms": [ - "pc", "apk", "models" ], @@ -672,8 +678,8 @@ { "id": "development-2026-09-27-2", "text": { - "fr": "## En développement — restauration Gaia · 27 septembre 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Panneaux Gaia restaurés : Paramètres, Suivi conso, FM et imports. Interfaces provisoires retirées ; fonctions indisponibles désactivées.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Styles des anciens composants, icônes du verrouillage et glyphes Téléphone corrigés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Espace de 44 pixels réservé au bouton Accueil ; date et batterie rétablies, sans texte `{{ level }}`.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Verrouillage Gaia réactivé, splash stabilisé, nom Navigateur/Browser localisé et crédits ajoutés.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : 26 contrôles applicatifs réussis, plus panneaux, imports, batterie, navigation et appels simulés.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) APK Preview8 installé sur Android 16 émulé : batterie Android, accès aux paramètres et mode HOME optionnel. Catalogue Android encore incomplet.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Android émulé : dix reprises d’arrière-plan, récupération du rendu et parité des ressources vérifiées. Verrouillage Gaia distinct de la sécurité Android.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo v21/v22 : scan et association Wi-Fi raccordés à Gaia via NetworkManager.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : essais RAM interrompus par l’arrêt du service graphique (code 139). Retour au v20 installé vérifié, sans nouveau flash.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Wi-Fi du candidat, caméra, API SIM/Bluetooth et suspension CPU non validés.\n", - "en": "## In development — Gaia restoration · 27 September 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Restored Gaia Settings, Usage, FM and import panels. Temporary interfaces removed; unavailable features disabled.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Corrected legacy component styles, lockscreen icons and Phone glyphs.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Reserve 44 pixels for Home; restore date and battery without `{{ level }}` placeholders.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Gaia lockscreen re-enabled, splash stabilized, Browser name localized and credits added.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: 26 app checks passed, plus panels, imports, battery, navigation and simulated calls.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Preview8 APK installed on emulated Android 16: Android battery, settings access and optional HOME mode. Android app catalogue still incomplete.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Emulated Android: ten background returns, renderer recovery and asset parity checked. Gaia locking remains separate from Android security.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo v21/v22: Wi-Fi scan and association connected to Gaia through NetworkManager.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: RAM trials interrupted by display-service failure (code 139). Return to installed v20 verified, without a new flash.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Candidate Wi-Fi, camera, SIM/Bluetooth APIs and CPU suspend unvalidated.\n" + "fr": "## 27/09/2026 : Retour aux composants Gaia\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![À propos](https://img.shields.io/badge/%C3%80%20propos-475569?style=flat-square) : Remerciements, écran de démarrage et nom du navigateur mis à jour.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Panneaux et styles Gaia d’origine rétablis dans Paramètres, Suivi conso, Radio FM et les imports.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Bouton Accueil dégagé des commandes ; date, batterie et écran de verrouillage rétablis.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Intégration](https://img.shields.io/badge/Int%C3%A9gration-475569?style=flat-square) : Mode lanceur, accès aux paramètres Android et reprise après arrière-plan.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Première intégration instable ; retour à la version précédente.\n", + "en": "## 27/09/2026 : Restoring Gaia components\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![About](https://img.shields.io/badge/About-475569?style=flat-square) : Credits, startup screen and browser name updated.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Original Gaia panels and styles restored in Settings, Data Usage, FM Radio and imports.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Home button no longer overlaps controls; date, battery and lock screen restored.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Integration](https://img.shields.io/badge/Integration-475569?style=flat-square) : Launcher mode, access to Android settings and background resume.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Wi-Fi](https://img.shields.io/badge/Wi--Fi-475569?style=flat-square) : Initial integration unstable; returned to the previous version.\n" }, "metadata": { "kind": "development", @@ -691,8 +697,8 @@ { "id": "development-2026-09-27-1", "text": { - "fr": "## En développement — 27 septembre 2026\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Callscreen Gaia pour les appels entrants/sortants, avec réponse et raccrochage. Remplace l’écran provisoire v13.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Journal d’appels persistant avec acquittement et dédoublonnage.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Batterie inconnue distincte d’une batterie vide ; index Contacts absent ou mal formé toléré.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Textes système affichés avec Fira Sans, sans modifier les polices d’icônes.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC avec modem simulé : appels, raccrochage en échec puis nouvel essai, journal, veille/réveil, menu Power, volume et batterie.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : boutons Power/Volume raccordés à Gaia et commandes natives d’écran, volume, arrêt et redémarrage.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : luminosité et alimentation sérialisées pour éviter l’écran noir au réveil ; accès PulseAudio corrigé pour le volume.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : un raccrochage réussi avec réponse D-Bus vide ne produit plus de fausse erreur.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v13 puis v20 installés après essais RAM ; démarrage, relecture, réglages et validation du slot contrôlés.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Appel sortant réel arrivé à la sonnerie puis raccroché. Appels entrants et audio de conversation non validés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Diagnostic caméra : un timeout n’est plus présenté comme une initialisation réussie. Deux capteurs détectés, sans trames reçues.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Caméra native indisponible, suspension CPU et commandes audio avancées incomplètes. Aucun nouvel APK.\n", - "en": "## In development — 27 September 2026\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Gaia Callscreen for incoming/outgoing calls, answer and hangup. Replaces the temporary v13 screen.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Persistent call log with acknowledgement and duplicate detection.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Distinguish unknown battery state from empty battery; tolerate missing or malformed Contacts indexes.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Render system text with Fira Sans while preserving icon fonts.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop with simulated modem: calls, failed hangup and retry, history, sleep/wake, Power menu, volume and battery.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: Power/Volume buttons connected to Gaia, with native screen, volume, shutdown and reboot controls.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: serialize brightness and power changes to prevent a black screen on wake; fix PulseAudio access for volume.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: successful hangup with an empty D-Bus reply no longer produces a false error.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v13 then v20 installed after RAM trials; startup, readback, settings and slot validation checked.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Real outgoing call reached ringing and was hung up. Incoming calls and conversation audio unvalidated.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Camera diagnostics: a timeout no longer counts as successful initialization. Two sensors detected, without received frames.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Native camera unavailable, CPU suspend and advanced audio controls incomplete. No new APK.\n" + "fr": "## 27/09/2026 : Appels et boutons physiques\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Téléphone](https://img.shields.io/badge/T%C3%A9l%C3%A9phone-475569?style=flat-square) : Interfaces Gaia d’appel entrant et sortant, avec journal d’appel.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Polices Fira, contacts et affichage de la batterie corrigés.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Boutons](https://img.shields.io/badge/Boutons-475569?style=flat-square) : Prise en charge des touches Marche/Arrêt et Volume, du menu d’extinction et du réveil de l’écran.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Caméra native encore indisponible.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Appels](https://img.shields.io/badge/Appels-475569?style=flat-square) : Sonnerie et raccrochage vérifiés ; conversation audio encore à tester.\n", + "en": "## 27/09/2026 : Calls and hardware buttons\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Phone](https://img.shields.io/badge/Phone-475569?style=flat-square) : Gaia incoming and outgoing call interfaces, with call history.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Fira fonts, contacts and battery display fixed.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Buttons](https://img.shields.io/badge/Buttons-475569?style=flat-square) : Support for Power and Volume keys, shutdown menu and waking the screen.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Native camera still unavailable.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) ![Calls](https://img.shields.io/badge/Calls-475569?style=flat-square) : Ringing and hanging up checked; conversation audio still needs testing.\n" }, "metadata": { "kind": "development", @@ -709,8 +715,8 @@ { "id": "development-2026-09-26-1", "text": { - "fr": "## En développement — 26 septembre 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Polices Fira Sans historiques utilisées dans Gaia et Tundra ; repli sans-serif et contrôle Fontconfig corrigés.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Boutons de diagnostic retirés des Paramètres.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Panneau matériel : capacités de la plateforme transmises correctement pour afficher la batterie.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : erreurs modem et transport distinguées ; message caméra indisponible corrigé.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : données persistantes sur ext4 2 Gio et validation du succès A/B après installation.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v8 : deux boots avec persistance, 9 contrôles Gaia et 9 système par boot. Outils d’installation et de secours testés localement.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v9 installé sur boot_a : deux démarrages avec 10 contrôles Gaia et 9 système chacun. Relecture conforme, cinq autres partitions préservées ; restauration réelle non testée.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Démarrage normal sans gestes de diagnostic automatiques ; plein écran établi avant Gaia, dimensions stables à 360 × 740 pixels CSS.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Mode `--diagnostics` séparé ; images de diagnostic exclues du lancement normal.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : v13 testé en RAM (8 contrôles de démarrage, 9 système), v14 en diagnostic (13 contrôles interactifs), Wi-Fi inclus.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Enregistrement UMTS, lecture audio et signal du micro vérifiés. Audio d’appel, caméra et veille non validés.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Construction du ramdisk indépendante de la langue du PC grâce à readelf en locale C.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Essais privés, sans ROM publique. Sources PC synchronisées ; correctif commun disponible pour Android, sans nouvel APK.\n", - "en": "## In development — 26 September 2026\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Use historical Fira Sans fonts in Gaia and Tundra; correct sans-serif fallback and Fontconfig checks.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Removed diagnostic buttons from Settings.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Hardware panel: pass platform capabilities correctly to display the battery.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: distinguish modem and transport errors; correct the unavailable-camera message.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: persistent data on a 2 GiB ext4 image and A/B success validation after installation.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v8: two boots with persistence, 9 Gaia and 9 system checks per boot. Installation and recovery tools tested locally.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v9 installed on boot_a: two boots with 10 Gaia and 9 system checks each. Matching readback, five other partitions preserved; actual restoration untested.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Normal startup without automatic diagnostic gestures; fullscreen before Gaia, stable 360 × 740 CSS-pixel layout.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Separate `--diagnostics` mode; diagnostic images excluded from normal launch.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: v13 tested in RAM (8 startup, 9 system checks), v14 diagnostics (13 interactive checks), including Wi-Fi.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) UMTS registration, audio playback and microphone signal checked. Call audio, camera and suspend unvalidated.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Ramdisk builds independent of the desktop language by running readelf in the C locale.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Private trials, without a public ROM. Desktop sources synchronized; shared Android fix available, without a new APK.\n" + "fr": "## 26/09/2026 : Démarrage et polices\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Polices Fira et informations de batterie corrigées ; boutons de test retirés des paramètres.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Conservation des données lors du démarrage installé.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Plein écran stable, sans gestes ni ouverture automatique d’applications.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Matériel](https://img.shields.io/badge/Mat%C3%A9riel-475569?style=flat-square) : Son et micro testés séparément ; audio d’appel, caméra et veille non validés.\n", + "en": "## 26/09/2026 : Startup and fonts\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Fira fonts and battery information fixed; test buttons removed from settings.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Installation](https://img.shields.io/badge/Installation-475569?style=flat-square) : Data preserved in the installed boot.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : Stable fullscreen, without automatic gestures or app launches.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Hardware](https://img.shields.io/badge/Hardware-475569?style=flat-square) : Sound and microphone tested separately; call audio, camera and sleep not validated.\n" }, "metadata": { "kind": "development", @@ -728,8 +734,8 @@ { "id": "development-2026-09-25-1", "text": { - "fr": "## En développement — 25 septembre 2026\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Bouton Accueil rond, dégradé transparent sur le fond d’écran et barre bleue dans les applications.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Dégradé masqué en bas de page et rétabli au défilement ; plus de rectangle bleu à l’appui sur Accueil.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Fira Sans embarquée avec graisses et italiques ; versions produit, Gaia, moteur et plateforme affichées séparément.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Reprise du chargement des icônes après une première mesure de taille nulle sur les trois plateformes.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) PC : icônes, navigation, permissions et panneau Informations FR/EN vérifiés avec Gecko 156.0.1.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android : état de navigation conservé après recréation de l’activité. Compilation Java réussie ; rendu à retester, aucun nouvel APK livré.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Tundra : image ext4 avec runtime ARM64, HAL, Phoc, Gecko et Gaia ; petits correctifs embarqués dans le ramdisk.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : backend dédié, informations Pixel 3a et lecture matérielle de la batterie. Sources de construction archivées avec empreintes.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo : WebRender matériel, icônes et polices contrôlés sur capture physique. v5 : 10 contrôles Gaia et 8 système réussis.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo : ajout de pd-mapper, désactivation d’IPA non initialisé et du sondage caméra prématuré. Données NV du modem copiées en RAM pour les essais.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v6 : scan Wi-Fi, connexion, IPv4, DNS et HTTPS vérifiés ; 13 contrôles Gaia et 9 système réussis. Sélection du réseau dans Gaia encore à raccorder.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Essais RAM sans flash, retour automatique après dix minutes et modifications perdues à l’arrêt. Démarrage à froid réussi ; redémarrage à chaud du compositeur en échec.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Pas de ROM publique ; modem, audio, caméra et veille encore à intégrer ou valider.\n", - "en": "## In development — 25 September 2026\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Round Home button, transparent wallpaper gradient and blue bar inside apps.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Hide the gradient at the bottom and restore it when scrolling; remove the blue rectangle when pressing Home.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Bundled Fira Sans weights and italics; separate product, Gaia, engine and platform versions.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Resume icon loading after an initial zero-size measurement on all three platforms.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Desktop: icons, navigation, permissions and French/English information panel checked with Gecko 156.0.1.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android: retain navigation state after activity recreation. Java compilation passed; visuals need retesting, no new APK delivered.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Tundra: ext4 image with ARM64 runtime, HAL, Phoc, Gecko and Gaia; small fixes bundled in the ramdisk.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: dedicated backend, Pixel 3a information and hardware battery readings. Build sources archived with checksums.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo: hardware WebRender, icons and fonts checked on a physical display capture. v5: 10 Gaia and 8 system checks passed.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Sargo: add pd-mapper, disable uninitialized IPA and premature camera probing. Copy modem NV data to RAM for trials.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Sargo v6: Wi-Fi scan, connection, IPv4, DNS and HTTPS verified; 13 Gaia and 9 system checks passed. Gaia network selection still pending.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) RAM trials without flashing, automatic return after ten minutes and changes lost at shutdown. Cold boot passed; warm compositor restart failed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) No public ROM; modem, audio, camera and suspend still need integration or validation.\n" + "fr": "## 25/09/2026 : Accueil et premiers essais natifs\n\n![En développement](https://img.shields.io/badge/En%20d%C3%A9veloppement-334155?style=flat-square)\n\n### ![Toutes les plateformes](https://img.shields.io/badge/Toutes%20les%20plateformes-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Accueil](https://img.shields.io/badge/Accueil-475569?style=flat-square) : Bouton rond, fond transparent sur l’accueil et bleu dans les applications.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : État appuyé du bouton, dégradé, polices et informations système corrigés.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Reprise de l’application modifiée dans les sources, pas encore testée sur Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Premiers essais d’une image native avec affichage accéléré et batterie.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Disponibilité](https://img.shields.io/badge/Disponibilit%C3%A9-475569?style=flat-square) : Essais temporaires ; de nombreuses fonctions matérielles restent à raccorder.\n", + "en": "## 25/09/2026 : Home screen and first native trials\n\n![In development](https://img.shields.io/badge/In%20development-334155?style=flat-square)\n\n### ![All Platforms](https://img.shields.io/badge/All%20Platforms-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Home](https://img.shields.io/badge/Home-475569?style=flat-square) : Round button, transparent background on Home and blue background in apps.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Pressed button state, gradient, fonts and system information fixed.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : App resume changed in source code, not yet tested on Android.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : First native image trials with accelerated display and battery support.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Availability](https://img.shields.io/badge/Availability-475569?style=flat-square) : Temporary trials; many hardware features still need connecting.\n" }, "metadata": { "kind": "development", @@ -747,8 +753,8 @@ { "id": "2.7-preview.7", "text": { - "fr": "## 2.7-preview.7 — APK construit, référence locale\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Permission caméra sur PC et reprise après la première autorisation Android.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Messages distincts pour une permission refusée, un capteur absent et un échec d’ouverture.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Versions produit et moteur séparées : Vulpes Preview7, Gaia 2.7.0, Gecko PC 156.0.1 et GeckoView Android 156.0.\n", - "en": "## 2.7-preview.7 — APK built, local reference\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Desktop camera permission and recovery after the first Android permission prompt.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Separate messages for denied permission, missing sensors and opening failures.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Separate product and engine versions: Vulpes Preview7, Gaia 2.7.0, desktop Gecko 156.0.1 and Android GeckoView 156.0.\n" + "fr": "## 2.7-preview.7\n\n![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square)\n\n### ![Desktop + Android](https://img.shields.io/badge/Desktop%20%2B%20Android-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![À propos](https://img.shields.io/badge/%C3%80%20propos-475569?style=flat-square) : Versions de Vulpes, Gaia et Gecko distinguées.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Gestion des autorisations et messages d’erreur plus précis.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Reprise après la première demande d’autorisation corrigée.\n", + "en": "## 2.7-preview.7\n\n![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square)\n\n### ![Desktop + Android](https://img.shields.io/badge/Desktop%20%2B%20Android-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![About](https://img.shields.io/badge/About-475569?style=flat-square) : Vulpes, Gaia and Gecko versions shown separately.\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Improved permission handling and clearer error messages.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Resume after the first permission request fixed.\n" }, "metadata": { "kind": "version", @@ -763,8 +769,8 @@ { "id": "2.7-preview.6", "text": { - "fr": "## 2.7-preview.6 — APK construit\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Photo Gaia sur PC et Android : aperçu et capture JPEG via webcam ou GeckoView.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Enregistrement dans Galerie et import par le sélecteur du système.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Flash et vidéo désactivés ; changement de caméra selon les capteurs disponibles.\n", - "en": "## 2.7-preview.6 — APK built\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Gaia Camera on desktop and Android: preview and JPEG capture through webcam or GeckoView.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Save photos in Gallery and import through the system picker.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Flash and video disabled; camera switching depends on available sensors.\n" + "fr": "## 2.7-preview.6\n\n![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square)\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Application Photo Gaia reliée à la webcam.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Galerie](https://img.shields.io/badge/Galerie-475569?style=flat-square) : Import de fichiers et photos disponibles dans Galerie.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Changement de capteur selon le matériel ; flash et vidéo indisponibles.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Application Photo Gaia reliée aux caméras Android.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Galerie](https://img.shields.io/badge/Galerie-475569?style=flat-square) : Import de fichiers et photos disponibles dans Galerie.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Caméra](https://img.shields.io/badge/Cam%C3%A9ra-475569?style=flat-square) : Changement de capteur selon le matériel ; flash et vidéo indisponibles.\n", + "en": "## 2.7-preview.6\n\n![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square)\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Gaia Camera app connected to the webcam.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Gallery](https://img.shields.io/badge/Gallery-475569?style=flat-square) : File import and photos available in Gallery.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Camera switching depends on hardware; flash and video unavailable.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Gaia Camera app connected to Android cameras.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Gallery](https://img.shields.io/badge/Gallery-475569?style=flat-square) : File import and photos available in Gallery.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Camera](https://img.shields.io/badge/Camera-475569?style=flat-square) : Camera switching depends on hardware; flash and video unavailable.\n" }, "metadata": { "kind": "version", @@ -779,8 +785,8 @@ { "id": "2.7-preview.5", "text": { - "fr": "## 2.7-preview.5 — APK construit\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Versions centralisées dans `release.json` ; produit, Gaia et moteur séparés.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Interface native commune PC/Android et contrôle de parité des ressources de l’APK.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) PC : réglages Linux, imports médias/vCard, notifications et capture webcam de test.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Android : retour au premier plan et récupération après arrêt du processus de rendu.\n", - "en": "## 2.7-preview.5 — APK built\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Versions centralized in `release.json`; product, Gaia and engine separated.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Shared desktop/Android native interface and APK asset parity checks.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Desktop: Linux settings, media/vCard imports, notifications and test webcam capture.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Android: foreground return and recovery after renderer termination.\n" + "fr": "## 2.7-preview.5\n\n![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square)\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Intégration](https://img.shields.io/badge/Int%C3%A9gration-475569?style=flat-square) : Réglages système, imports de médias et de contacts, notifications et essai webcam.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Interface et numérotation des versions alignées avec Android.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Interface et numérotation des versions alignées avec le PC.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Reprise après arrière-plan et récupération de l’affichage améliorées.\n", + "en": "## 2.7-preview.5\n\n![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square)\n\n### ![Desktop](https://img.shields.io/badge/Desktop-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Integration](https://img.shields.io/badge/Integration-475569?style=flat-square) : System settings, media and contact imports, notifications and webcam test.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Interface and version numbering aligned with Android.\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Interface](https://img.shields.io/badge/Interface-475569?style=flat-square) : Interface and version numbering aligned with Desktop.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : Improved background resume and display recovery.\n" }, "metadata": { "kind": "version", @@ -795,8 +801,8 @@ { "id": "2.7-156.0.2", "text": { - "fr": "## 2.7-156.0.2 — APK historique construit (révision 4)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android : reprise de l’activité et des sessions pour réduire les écrans blancs.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Accès aux réglages Android, volume et luminosité de la fenêtre.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Import de médias et contacts ; notifications natives avec permissions.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Transfert vers Téléphone, SMS, Horloge et Appareil photo Android. Aucun envoi silencieux ni remplacement des applications par défaut.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Numérotation historique : moteur Android Gecko 156.0, malgré le nom 2.7-156.0.2.\n", - "en": "## 2.7-156.0.2 — Historical APK built (revision 4)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Android: activity and session recovery to reduce blank screens.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Access to Android settings, volume and window brightness.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Media and contact imports; native notifications with permissions.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Handoff to Android Phone, SMS, Clock and Camera. No silent sending or replacement of default apps.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Historical numbering: Android engine Gecko 156.0, despite the 2.7-156.0.2 name.\n" + "fr": "## 2.7-156.0.2\n\n![APK construit · non publié](https://img.shields.io/badge/APK%20construit%20%C2%B7%20non%20publi%C3%A9-334155?style=flat-square)\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Intégration](https://img.shields.io/badge/Int%C3%A9gration-475569?style=flat-square) : Réglages Android, son, luminosité, imports et notifications.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Appels, SMS, horloge et caméra confiés aux applications Android.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Stabilité](https://img.shields.io/badge/Stabilit%C3%A9-475569?style=flat-square) : Écrans blancs et reprise après arrière-plan corrigés.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Version](https://img.shields.io/badge/Version-475569?style=flat-square) : Ancienne numérotation : ce numéro ne correspond pas à une mise à jour de Gecko.\n", + "en": "## 2.7-156.0.2\n\n![APK built · not published](https://img.shields.io/badge/APK%20built%20%C2%B7%20not%20published-334155?style=flat-square)\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Integration](https://img.shields.io/badge/Integration-475569?style=flat-square) : Android settings, sound, brightness, imports and notifications.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : Calls, SMS, clock and camera handled by Android apps.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Stability](https://img.shields.io/badge/Stability-475569?style=flat-square) : White screens and background resume fixed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Version](https://img.shields.io/badge/Version-475569?style=flat-square) : Historical numbering: this number does not represent a Gecko update.\n" }, "metadata": { "kind": "version", @@ -810,8 +816,8 @@ { "id": "2.7-156.0.1", "text": { - "fr": "## 2.7-156.0.1 — APK publié (révision 3)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Nom « Vulpes OS - Preview » et icône du projet.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Clignotement du fond d’écran corrigé.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Numérotation historique, distincte de la version du moteur Android.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-156.0.1)\n", - "en": "## 2.7-156.0.1 — APK published (revision 3)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) “Vulpes OS - Preview” name and project icon.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wallpaper flickering corrected.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Historical numbering, separate from the Android engine version.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-156.0.1)\n" + "fr": "## 2.7-156.0.1\n\n![Publié](https://img.shields.io/badge/Publi%C3%A9-334155?style=flat-square)\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Identité](https://img.shields.io/badge/Identit%C3%A9-475569?style=flat-square) : Nom « Vulpes OS – Preview » et icône du projet.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Accueil](https://img.shields.io/badge/Accueil-475569?style=flat-square) : Clignotement du fond d’écran corrigé.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Version](https://img.shields.io/badge/Version-475569?style=flat-square) : Ancienne numérotation, conservée pour retrouver cette publication.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-156.0.1)\n", + "en": "## 2.7-156.0.1\n\n![Published](https://img.shields.io/badge/Published-334155?style=flat-square)\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Branding](https://img.shields.io/badge/Branding-475569?style=flat-square) : “Vulpes OS – Preview” name and project icon.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Home](https://img.shields.io/badge/Home-475569?style=flat-square) : Wallpaper flickering fixed.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Version](https://img.shields.io/badge/Version-475569?style=flat-square) : Historical numbering retained to identify this release.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-156.0.1)\n" }, "metadata": { "kind": "version", @@ -825,8 +831,8 @@ { "id": "2.7-preview.2", "text": { - "fr": "## 2.7-preview.2 — APK publié\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Clignotement du fond d’écran dans la Preview Android.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.2)\n", - "en": "## 2.7-preview.2 — APK published\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Wallpaper flickering in the Android Preview.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.2)\n" + "fr": "## 2.7-preview.2\n\n![Publié](https://img.shields.io/badge/Publi%C3%A9-334155?style=flat-square)\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Accueil](https://img.shields.io/badge/Accueil-475569?style=flat-square) : Clignotement du fond d’écran corrigé.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.2)\n", + "en": "## 2.7-preview.2\n\n![Published](https://img.shields.io/badge/Published-334155?style=flat-square)\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) ![Home](https://img.shields.io/badge/Home-475569?style=flat-square) : Wallpaper flickering fixed.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.2)\n" }, "metadata": { "kind": "version", @@ -840,8 +846,8 @@ { "id": "2.7-preview.1", "text": { - "fr": "## 2.7-preview.1 — APK publié\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Première Preview Android avec Gaia et GeckoView.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Version archivée ; clignotement du fond d’écran connu.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.1)\n", - "en": "## 2.7-preview.1 — APK published\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) First Android Preview with Gaia and GeckoView.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Archived version; known wallpaper flickering issue.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.1)\n" + "fr": "## 2.7-preview.1\n\n![Publié](https://img.shields.io/badge/Publi%C3%A9-334155?style=flat-square)\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Découverte](https://img.shields.io/badge/D%C3%A9couverte-475569?style=flat-square) : Première Preview Android pour découvrir Vulpes sans flasher le téléphone.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Accueil](https://img.shields.io/badge/Accueil-475569?style=flat-square) : Fond d’écran clignotant connu dans cette première version.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.1)\n", + "en": "## 2.7-preview.1\n\n![Published](https://img.shields.io/badge/Published-334155?style=flat-square)\n\n### ![Android / APK](https://img.shields.io/badge/Android%20%2F%20APK-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Preview](https://img.shields.io/badge/Preview-475569?style=flat-square) : First Android Preview to try Vulpes without flashing the phone.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) ![Home](https://img.shields.io/badge/Home-475569?style=flat-square) : Known wallpaper flickering in this first version.\n\n[Release](https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.1)\n" }, "metadata": { "kind": "version", @@ -855,8 +861,8 @@ { "id": "history", "text": { - "fr": "## Étapes antérieures — rétrospective technique\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Base Gaia historique avec identité Vulpes, fond d’écran, traductions et informations système.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Portage expérimental Gecko 45 vers 52, puis séparation de Gaia, des services et du moteur.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) API de réglages, applications, contacts, messages, alarmes, stockage et communications entre applications.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Adaptation des composants Gaia, gestes tactiles, navigateur et applications aux moteurs récents.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Mise à jour Gecko avec contrôles et retour arrière ; mise à jour Gaia sans recompilation du moteur.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Applications Firefox OS archivées, QEMU, puis Gecko ARM64 dans Droidian et sous compositeur dédié.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo : inventaire, sauvegardes de boot, racine distincte, services HAL et PID 1 Tundra.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Essais graphiques Fastboot temporaires avec secours SSH et retour automatique.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Noyau 4.9-124-google-sargo, adaptation Android 9/API 28. Étapes historiques, sans nouvelles releases datées.\n", - "en": "## Earlier milestones — technical retrospective\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Historical Gaia base with Vulpes branding, wallpaper, translations and system information.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) Experimental Gecko 45 to 52 port, followed by separation of Gaia, services and engine.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) APIs for settings, apps, contacts, messages, alarms, storage and inter-app communication.\n- ![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) Adapt Gaia components, touch gestures, browser and apps to recent engines.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Gecko updates with checks and rollback; Gaia updates without rebuilding the engine.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Archived Firefox OS apps, QEMU, then ARM64 Gecko inside Droidian and under a dedicated compositor.\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) Sargo: inventory, boot backups, separate root, HAL services and Tundra PID 1.\n- ![Test](https://img.shields.io/badge/Test-75658A?style=flat-square) Temporary graphical Fastboot trials with SSH recovery and automatic return.\n- ![Note](https://img.shields.io/badge/Note-6B7280?style=flat-square) Kernel 4.9-124-google-sargo, Android 9/API 28 adaptation. Historical milestones, without newly dated releases.\n" + "fr": "## Premières étapes\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Applications](https://img.shields.io/badge/Applications-475569?style=flat-square) : Adaptation des contacts, messages, paramètres, alarmes et du stockage.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Identité](https://img.shields.io/badge/Identit%C3%A9-475569?style=flat-square) : Création de Vulpes : identité visuelle, traductions et informations système.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Moteur](https://img.shields.io/badge/Moteur-475569?style=flat-square) : Passage des anciens moteurs Firefox OS à un Gecko moderne.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Démarrage](https://img.shields.io/badge/D%C3%A9marrage-475569?style=flat-square) : Premiers démarrages natifs et essais matériels sur le Pixel 3a.\n", + "en": "## Early milestones\n\n### ![Desktop + Sargo](https://img.shields.io/badge/Desktop%20%2B%20Sargo-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Apps](https://img.shields.io/badge/Apps-475569?style=flat-square) : Adaptation of contacts, messages, settings, alarms and storage.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Branding](https://img.shields.io/badge/Branding-475569?style=flat-square) : Creation of Vulpes: visual identity, translations and system information.\n- ![Change](https://img.shields.io/badge/Change-64748B?style=flat-square) ![Engine](https://img.shields.io/badge/Engine-475569?style=flat-square) : Move from old Firefox OS engines to a modern Gecko.\n\n### ![Sargo / Pixel 3a](https://img.shields.io/badge/Sargo%20%2F%20Pixel%203a-2563EB?style=flat-square)\n\n- ![Add](https://img.shields.io/badge/Add-487768?style=flat-square) ![Startup](https://img.shields.io/badge/Startup-475569?style=flat-square) : First native boots and hardware trials on Pixel 3a.\n" }, "metadata": { "kind": "history", @@ -876,24 +882,57 @@ "version": "2.7-preview.14", "after": "2.7-156.0.1", "url": "https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.14", - "summary": "# 🦊 Vulpes OS — Preview 14\n\n**2.7-156.0.1 → 2.7-preview.14** · 30 septembre / September 2026\n\n🇫🇷 Une seule mise à jour regroupe les évolutions depuis la dernière Preview publiée. Téléchargez l’APK ci-dessous et installez-le par-dessus l’ancienne version. Les APK intermédiaires ne sont pas ajoutés à cette release.\n\n🇬🇧 One update brings together the changes since the last published Preview. Download the APK below and install it over the previous version. Intermediate APKs are not included in this release.\n\n| Composant / Component | Version |\n| --- | --- |\n| Vulpes OS - Preview | **2.7-preview.14** · Android versionCode **14** |\n| Gaia | **2.7.0** |\n| Gecko embarqué dans l’APK / APK engine | **156.0** · GeckoView `156.0.20260921121718` |\n| Gecko PC / Sargo | **156.0.1** |\n\nLe numéro Vulpes est maintenant distinct de celui du moteur. L’ancien nom `2.7-156.0.1` ne prouvait pas que l’APK embarquait Gecko 156.0.1. / Vulpes and engine versions are now separate. The old `2.7-156.0.1` name did not mean that the APK contained Gecko 156.0.1.\n\n## 🇫🇷 Nouveautés cumulées\n\n### Android : une Preview mieux intégrée\n\n- Reprise des sessions après changement d’application, recréation de l’activité et arrêt du processus de rendu ; récupération des écrans blancs et attente du chargement de Gaia avant d’ouvrir une notification.\n- Accès aux paramètres Android, réglage du volume multimédia et luminosité propre à la fenêtre Vulpes. Le Wi-Fi et les autres réglages système Android gardent leur adaptateur Android.\n- Mode Accueil Android optionnel, bouton Accueil rond et gestionnaire des tâches Gaia par appui long. Le catalogue des applications Android reste à compléter.\n- Notifications dans le volet Android : permissions, remplacement par identifiant, fermeture et retour vers l’application concernée.\n- Transfert d’un appel vers le composeur Android, d’un message vers SMS Android et accès aux réveils Android. **La Preview ne remplace pas les applications Téléphone/SMS par défaut et n’envoie pas de SMS en silence.**\n- Import de médias et de contacts avec choix explicite par l’utilisateur ; fichiers copiés dans l’espace Vulpes, sans suppression des originaux Android.\n\n### Les véritables applications et composants Gaia\n\n- **Photo et Galerie** : application Photo Gaia avec aperçu, capture JPEG, enregistrement dans Galerie et changement de capteur selon le matériel. Correction de la première autorisation caméra et des erreurs trompeuses « déjà utilisée » ; flash/vidéo non pris en charge restent désactivés. Le pincement ne zoome plus toute l’interface.\n- **Galerie, Vidéo et Musique** : corrections des vignettes, de l’éditeur d’image, du retour après fermeture, des imports et de la lecture. Texte d’accueil Vidéo contenu dans l’écran.\n- **Calendrier et Horloge** : corrections de la sauvegarde des événements avec rappel, des alarmes d’événements supprimés, des erreurs de notification et des libellés d’accessibilité du calendrier.\n- **SMS et Contacts** : filtres de conversations, migration des identifiants de messages, événements d’envoi et écritures sérialisées ; correction d’un index de contacts absent ou mal formé qui bloquait les recherches et le journal.\n- **Navigateur** : page d’accueil locale intégrée, automatiquement en français pour `fr`/`fr-*`, sinon en anglais ; liens et recherches ouverts dans la session de navigation, mode privé conservé.\n- **Paramètres** : retour des panneaux Gaia et retrait des boutons/interfaces de diagnostic provisoires. Les capacités indisponibles restent identifiables ; les versions Vulpes, Gaia, Gecko, plateforme et adaptation sont affichées séparément.\n\n### Interface, polices et navigation\n\n- Fira Sans historique embarquée et appliquée jusque dans les composants Shadow DOM, sans remplacer les polices d’icônes.\n- Variantes d’icônes raster Gaia jusqu’à 2,25× restaurées dans 1 047 références CSS ; chargement repris lorsque la première mesure d’une icône valait zéro.\n- Écran de verrouillage Gaia, date et batterie dans les composants d’origine ; correction du texte `{{ level }}` et alignement des informations de version.\n- Bouton Accueil qui ne masque plus les commandes des applications et des appels ; fond transparent/dégradé à l’accueil, espace réservé dans les applications, bouton à droite en paysage.\n- Correction des menus déroulants qui coupaient les lettres, des en-têtes Téléphone/Contacts et des icônes du journal d’appels.\n- Splash Vulpes stabilisé, animation d’arrêt Gaia passée de l’orange au bleu, nom localisé Navigateur/Browser et remerciements dans les informations légales.\n- Respect du mode silencieux des notifications Gaia, y compris lors de leur restauration.\n\n### PC et Tundra / Pixel 3a — avancées du projet, distinctes de l’APK\n\n- Base Gaia commune et contrôle automatique de la parité des fichiers réellement empaquetés ; webcam PC avec la même application Photo et imports via les sélecteurs du système.\n- Clavier Gaia natif raccordé : bon pavé numérique pour le destinataire, sélection dans le champ actif, protection contre les réponses obsolètes, taille portrait corrigée à environ 60 pixels CSS par touche sur Pixel. Le clavier de l’APK reste celui d’Android.\n- Interfaces Gaia d’appel entrant/sortant, décrocher/raccrocher, journal persistant, Power/Volume, verrouillage et batterie raccordés au backend natif.\n- Tundra sur Sargo : image système autonome, Gaia/Gecko ARM64 avec WebRender matériel, démarrage depuis le stockage et données conservées. v48 installée après deux essais RAM, relecture de `boot_a` et validation du slot A.\n- Wi-Fi : suppression des rafales de scans qui épuisaient la mémoire, erreurs explicites, connexion HTTPS vérifiée et profils privés persistants avec reconnexion automatique.\n- Caméra native : aperçu NV21 accéléré, transport binaire, environ 23 images/s mesurées dans l’essai documenté, capture et bascule des capteurs ; luminosité manuelle accélérée et commandes écran sérialisées.\n- SMS entrants conservés avant acquittement et dédoublonnés ; notifications dans le volet/verrouillage Gaia ; vibrations matérielles bornées et annulables.\n- Routage écouteur/haut-parleur, micro muet et volume d’appel raccordés. **Le dernier contrôle laisse le modem en recherche : SMS opérateur et audio en conversation ne sont pas qualifiés dans cette passe.**\n\n## 🇬🇧 Cumulative changes\n\n### Android integration\n\n- Restore sessions after app switching, activity recreation and renderer termination; recover blank screens and wait for Gaia before opening a notification target.\n- Android settings access, media volume and per-window brightness; Android Wi-Fi and other system settings keep their Android adapter.\n- Optional Android Home role, round Home button and original Gaia task manager on long press. The Android app catalogue remains incomplete.\n- Native Android notifications with permissions, tag replacement, dismissal and return to the correct application.\n- Hand off calls to the Android dialler, messages to the Android SMS app and alarms to Android. **This Preview is not the default Phone/SMS application and does not silently send messages.**\n- Explicit media/contact selection and private copies inside Vulpes; deleting an imported copy does not delete the Android original.\n\n### Original Gaia applications and interface\n\n- Original **Camera and Gallery**: preview, JPEG capture, Gallery storage and camera switching where supported. Fix first-use permission handling and misleading “camera in use” errors; unsupported flash/video controls remain disabled. Pinching no longer zooms the entire app.\n- **Gallery, Video and Music**: thumbnail, editing, cleanup, import and playback fixes; introductory Video text stays within the screen.\n- **Calendar and Clock**: event/reminder saving, deleted-event alarms, notification errors and calendar accessibility labels corrected.\n- **SMS and Contacts**: conversation filters, message-ID migration, sending events and serialized writes; tolerate missing/malformed legacy contact indexes.\n- **Browser**: bundled local welcome page following Gaia’s language, French for `fr`/`fr-*`, English otherwise; searches and links use the browser session and private mode is retained.\n- **Settings**: restore original Gaia panels, remove temporary diagnostic interfaces, expose unsupported capabilities honestly and separate product, Gaia, engine, platform and adapter information.\n- Bundle historical **Fira Sans**, including Shadow DOM text, while preserving icon fonts. Restore raster density variants up to 2.25× across 1,047 CSS references and recover icons first measured at zero size.\n- Restore Gaia lockscreen, date and battery components; fix battery placeholders, version-row alignment, clipped dropdown text, Phone/Contacts headers and call-log icon density.\n- Home no longer overlaps app/call controls; transparent home background, reserved navigation space inside apps and right-side Home in landscape.\n- Stable Vulpes splash, original shutdown animation recoloured blue, localized Browser name and legal credits. Respect silent notification flags, including restored notifications.\n\n### Desktop and Tundra / Pixel 3a — separate from APK hardware support\n\n- Shared Gaia sources with packaged-content parity checks, original Camera UI for desktop webcams and system file pickers.\n- Native Gaia keyboard bridge: numeric recipient keypad, correct active-field selection, stale-reply protection and portrait key sizing. Android continues to use its system keyboard.\n- Original incoming/outgoing call UI, answer/hangup, persistent call log, Power/Volume, lockscreen and battery connected to the native backend.\n- Self-contained Tundra userspace, ARM64 Gaia/Gecko with hardware WebRender, persistent data and installed boot. v48 passed two RAM boots, image readback and slot-A validation.\n- Wi-Fi scan throttling/coalescing prevents memory exhaustion; actionable errors, tested HTTPS connectivity and private persistent profiles with autoconnect.\n- Faster binary/NV21 camera preview, about 23 fps in the documented trial, capture and sensor switching; faster manual brightness and serialized screen controls.\n- Durable, deduplicated incoming SMS; Gaia tray/lockscreen notifications and bounded, cancellable hardware vibration.\n- Earpiece/speaker routing, microphone mute and call volume connected. **The modem was still searching in the latest check: carrier SMS and two-way conversation audio remain unqualified in this pass.**\n\n## 📦 Installation / Compatibility\n\n- **Android 8.0 / API 26 minimum déclaré / declared minimum** ; cible / target API 37. Tests sur émulateur Android 16 / API 36, sans prétendre valider chaque téléphone ou version Android.\n- APK universel / universal: **ARM64, ARMv7, x86_64**, environ / about **598 MiB**.\n- Même paquet `org.vulpes_os.preview` et même certificat de signature que `2.7-156.0.1`, versionCode 3 → 14. Installation par-dessus prévue pour conserver les données ; les sauvegarder avant une mise à jour expérimentale. / Same package and signing certificate; in-place updates are supported. Back up data before experimental updates.\n- Preview de développement, pas une ROM. Aucun fichier Sargo privé n’est joint. / Development Preview, not a ROM. No private Sargo image is attached.\n- Caméra : flash/vidéo non exposés par l’adaptateur ; fonctions matérielles selon la plateforme. Notifications sans service push permanent ; alarmes Gaia dépendantes du processus, distinctes des alarmes système Android. / Camera flash/video are not exposed; hardware support varies by platform. No permanent push service; Gaia alarms depend on the process and are separate from Android system alarms.\n- Sargo : conversation audio, rotation par capteur, suspension CPU, Bluetooth et fonctions avancées restent à compléter ou qualifier. / Sargo conversation audio, sensor rotation, CPU suspend, Bluetooth and advanced functions remain incomplete or unqualified.\n\n### Validation\n\nSignature APK et parité du contenu vérifiées ; démarrage et saisie SMS sur Android 16 émulé. Tests locaux Photo/Galerie/Calendrier, reprises d’arrière-plan et récupération du rendu documentés dans l’historique. Dernière passe : 18 tests JS + 15 tests Python ciblés, parcours d’appel PC avec modem simulé, deux boots RAM Sargo puis démarrage installé. **Ces contrôles ne prouvent pas une conversation téléphonique réelle.**\n\nAPK signature and shared-content parity verified; startup and SMS composition tested on an Android 16 emulator. Earlier Camera/Gallery/Calendar, background-resume and renderer-recovery tests are documented below. Latest pass: 18 targeted JS tests + 15 Python tests, simulated desktop call workflows, two Sargo RAM boots and an installed boot. **These checks do not validate a real two-way phone conversation.**\n\n### 🔎 Intégrité / Integrity\n\nTéléchargez / Download `SHA256SUMS.txt` avec / alongside the APK:\n\n```sh\nsha256sum -c SHA256SUMS.txt\n```\n\n### Sources et historique / Sources and history\n\nLe dépôt publié contient encore la présentation du projet. Cette release distribue l’APK déjà construit ; son tag ne constitue pas un instantané reproductible des sources complètes. Les archives automatiques du tag sont masquées. Les changelogs FR/EN joints conservent toutes les étapes depuis `2.7-156.0.1`, y compris les limites et résultats propres à chaque étape.\n\nThe public repository still contains the project presentation. This release distributes the existing APK; its tag is not a reproducible snapshot of the full application sources. Automatic tag archives are hidden. The attached FR/EN changelogs preserve every stage since `2.7-156.0.1`, including stage-specific limitations and results." + "summary": "# Vulpes OS — 2.7-preview.14\n\n🇫🇷 Preview expérimentale. L’APK peut être installé par-dessus la Preview précédente. Les appels et SMS passent par Android. Les avancées Sargo ci-dessous sont distinctes de l’APK ; cette release ne fournit pas de nouvelle image pour le Pixel.\n\n🇬🇧 Experimental Preview. Install the APK over the previous Preview. Calls and SMS use Android. Sargo progress below is separate from the APK; this release does not provide a new Pixel image.\n\nAndroid 8 minimum · Essais sur émulateur Android. / Tested on an Android emulator.", + "include_entry": true }, "v2.7-preview.15": { "version": "2.7-preview.15", "after": "2.7-preview.14", - "summary": "## 🇫🇷 Vulpes OS — Preview 15\n\nPremière publication des **sources communes PC / Android / Tundra**, accompagnée d'un nouvel APK expérimental.\n\n### Télécharger et essayer\n- **Android :** installer `vulpes-os-preview-2.7-preview.15.apk`. Android 8 minimum déclaré, API 37 ciblée ; ARM64, ARMv7 et x86_64. L'APK garde la signature des précédentes Preview.\n- **PC Linux :** cloner le dépôt, puis exécuter `./setup.sh` et `./run.sh`. Le moteur Mozilla épinglé est téléchargé et son empreinte vérifiée.\n- **Sargo :** les sources Tundra sont incluses. **Aucune ROM générique flashable n'est fournie** : notre image privée dépend encore de l'installation et du partitionnement du téléphone de développement.\n\n### Depuis la Preview 14\n- Correction du format des dates des SMS qui laissait les conversations Gaia vides ; conservation des messages et des états d'envoi/échec côté hôte.\n- Libération et remplacement des flux caméra fiabilisés, pour empêcher une ancienne session de fermer le nouveau capteur.\n- Sources Tundra : focus tactile, zoom numérique et capture JPEG du capteur ; aperçu distinct de la photo en pleine résolution. Coupure du vibreur corrigée et arrêt de secours du service.\n- Sources PC, APK et Tundra réunies, scripts de préparation et de compilation inclus, README français et anglais remis à jour. Les profils privés et la documentation de travail ne sont pas publiés.\n\n**Validation :** 42 tests de services, démarrage et navigation sur PC avec Gecko 156.0.1 ; sur émulateur Android 16, capture Photo/Galerie, reprise de caméra, dix retours depuis l’arrière-plan et récupération après arrêt du processus d’affichage. APK compilé depuis `b38dea0` ; le tag ajoute uniquement un correctif des scripts de test PC.\n\n**Versions :** Vulpes `2.7-preview.15` · Gaia `2.7.0` · Gecko PC `156.0.1` · GeckoView Android `156.0`. Les fonctions matérielles diffèrent selon la plateforme : sous Android, appels et SMS sont délégués aux applications Android, pas au modem Tundra.\n\n**Limites connues :** build de développement signé, débogage Gecko accessible via ADB autorisé ; toutes les versions et tous les modèles Android ne sont pas qualifiés. Sur Sargo : aperçu caméra autour de 16 i/s, flash/vidéo, rotation automatique et veille profonde incomplets, audio des appels à qualifier. Le grand dialogue signalé après un envoi SMS reste à identifier. Cette release n'annonce pas la résolution de ces limites.\n\n## 🇬🇧 Vulpes OS — Preview 15\n\nFirst publication of the **shared desktop / Android / Tundra sources**, with a new experimental APK.\n\n### Download and try\n- **Android:** install `vulpes-os-preview-2.7-preview.15.apk`. Declared minimum Android 8, target API 37; ARM64, ARMv7 and x86_64. Signed with the same key as previous Preview builds.\n- **Linux desktop:** clone the repository, then run `./setup.sh` and `./run.sh`. The pinned Mozilla engine is downloaded and its checksum verified.\n- **Sargo:** Tundra sources are included. **No generic flashable ROM is supplied**: our private image still depends on the development phone's installation and storage layout.\n\n### Since Preview 14\n- Fix SMS date formatting that left Gaia conversations empty; retain messages and sent/failed states in the host.\n- Make camera stream release and replacement reliable, so an older session cannot close the new sensor.\n- Tundra sources: touch focus, digital zoom and sensor JPEG capture, separating preview from full-resolution photos. Fix vibration shutdown and add a service stop safeguard.\n- Publish desktop, APK and Tundra sources with setup/build scripts and updated English/French READMEs. Private profiles and internal working documents are excluded.\n\n**Validation:** 42 service tests, desktop startup/navigation on Gecko 156.0.1; Android 16 emulator Photo/Gallery capture, camera resume, ten background/resume cycles and recovery after renderer termination. APK built from `b38dea0`; the tag adds only a desktop test-script fix.\n\n**Versions:** Vulpes `2.7-preview.15` · Gaia `2.7.0` · desktop Gecko `156.0.1` · Android GeckoView `156.0`. Hardware capabilities differ by platform: Android calls and SMS hand off to Android apps, not to the Tundra modem.\n\n**Known limits:** signed development build, Gecko debugging through authorized ADB; not every Android version/device is qualified. On Sargo: approximately 16 fps camera preview, incomplete flash/video, automatic rotation and deep suspend, call audio awaiting qualification. A reported large dialog after SMS sending remains under investigation. This release does not claim those limits are fixed.\n" + "summary": "# Vulpes OS — 2.7-preview.15\n\n🇫🇷 Preview expérimentale. L’APK peut être installé par-dessus la Preview précédente. Les appels et SMS passent par Android. Les avancées Sargo ci-dessous sont distinctes de l’APK ; cette release ne fournit pas de nouvelle image pour le Pixel.\n\n🇬🇧 Experimental Preview. Install the APK over the previous Preview. Calls and SMS use Android. Sargo progress below is separate from the APK; this release does not provide a new Pixel image.\n\nAndroid 8 minimum · Essais sur émulateur Android. / Tested on an Android emulator.", + "include_entry": true, + "url": "https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.15" }, "v2.7-preview.17": { "version": "2.7-preview.17", "after": "2.7-preview.15", "url": "https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.17", - "summary": "# Français\n\nAPK expérimental Android : Vulpes OS 2.7-preview.17, Gaia 2.7.0, GeckoView 156.0. Installation par-dessus une Preview précédente signée avec la même clé. Android 8.0/API26 minimum ; essais réalisés sur émulateur Android 16/API36.\n\n## 2.7-preview.17 — APK construit · 5 octobre 2026\n\n### Commun · Gaia / PC\n\n- Remettre Marketplace sur l’accueil avec son icône originale et le catalogue Vulpes. Ouvrir sa version française pour les langues fr, anglaise sinon.\n- Adapter les téléchargements du catalogue en installations confirmées : vérifier les archives ZIP, ajouter l’application à l’accueil et permettre son lancement et sa désinstallation.\n- Conserver les applications installées séparément des sources Gaia, sur des origines distinctes et sans privilèges système hérités des anciens manifestes.\n- Valider sur PC le parcours réel avec 2048 : catalogue, confirmation, installation, lancement, persistance et désinstallation. Contrôler les archives corrompues, chemins invalides, limites, annulation et confirmations à usage unique.\n\n### Android · APK\n\n- Construire et signer Preview17 avec le même Marketplace et le même service d’installation. Utiliser la vue GeckoView existante pour le catalogue et le stockage privé Android pour les paquets.\n- Vérifier sur émulateur Android 16/API36 le clic Installer, la confirmation, l’apparition sur l’accueil et le lancement de 2048 sans accès au pont système Vulpes. Vérifier aussi la conservation après arrêt forcé et relance, puis la désinstallation.\n\n## 2.7-preview.16 — APK construit · 5 octobre 2026\n\n### Commun · Gaia / PC\n\n- Rétablir les sélecteurs Gaia de fond d’écran et de sons, leur retour vers Paramètres et leur annulation par Accueil. Partager le transport des images et sons enregistrés entre PC et Android.\n- Propager les changements de langue à l’accueil, y compris sans permission de lecture générale des réglages. Vérifier les libellés FR/EN et la persistance.\n- Rétablir l’arrêt du balayage horizontal sur une page et masquer les applications de développement sur l’accueil, sans les supprimer des sources.\n- Utiliser le logo Vulpes fourni dans le splash et adapter les composants originaux de la liste des sons au moteur actuel.\n- Vérifier sur PC deux changements consécutifs de fond, le choix d’un son et les panneaux Gaia restaurés.\n\n### Android · APK\n\n- APK local Preview16 construit et signé ; contenu commun et version vérifiés. Aucune publication dans cette étape.\n- Valider Vulpes comme lanceur HOME, afficher le verrouillage Gaia après veille et rétablir le retour Android depuis la caméra ouverte au verrouillage.\n- Masquer les barres système Android en mode immersif, en conservant leur accès temporaire par balayage.\n- Tests sur émulateur Android 16/API36 : verrouillage, caméra/retour, FR/EN, accueil sans applications de test, fond d’écran et son. Fond conservé après arrêt forcé et relance, sans changement répété pendant 15 secondes. Autres appareils Android non qualifiés dans cette étape.\n\nLes correctifs caméra du 8 octobre ainsi que les derniers correctifs Wi-Fi, bannière et thème Marketplace du 6 octobre ne sont pas inclus dans cet APK. La validation de la caméra avant sur Sargo reste ouverte. Cette publication concerne uniquement Android.\n\n# English\n\nExperimental Android APK: Vulpes OS 2.7-preview.17, Gaia 2.7.0, GeckoView 156.0. Install over an earlier Preview signed with the same key. Android 8.0/API26 minimum; tested on an Android 16/API36 emulator.\n\n## 2.7-preview.17 — APK built · 5 October 2026\n\n### Shared · Gaia / Desktop\n\n- Restore Marketplace on Home with its original icon and the Vulpes catalogue. Select French for fr languages and English otherwise.\n- Turn catalogue downloads into confirmed installations: validate ZIP archives, add the application to Home and support launch and removal.\n- Store installed applications separately from Gaia sources, on distinct origins and without system privileges inherited from archived manifests.\n- Validate the real desktop workflow with 2048: catalogue, confirmation, installation, launch, persistence and removal. Check damaged archives, invalid paths, limits, cancellation and single-use confirmations.\n\n### Android · APK\n\n- Build and sign Preview17 with the same Marketplace and installation service. Use the existing GeckoView browser for the catalogue and private Android storage for packages.\n- Verify the Install click, confirmation, Home icon and 2048 launch without access to the Vulpes system bridge on an Android 16/API36 emulator. Also verify persistence after force-stop/relaunch and removal.\n\n## 2.7-preview.16 — APK built · 5 October 2026\n\n### Shared · Gaia / Desktop\n\n- Restore Gaia wallpaper and sound pickers, return navigation to Settings and cancellation through Home. Share persisted image and sound transport between desktop and Android.\n- Propagate language changes to Home without granting general settings read access. Check French/English labels and persistence.\n- Restore horizontal page snapping and hide development apps from Home without deleting their sources.\n- Use the supplied Vulpes logo in the splash and adapt the original sound-list components to the current engine.\n- Verify two consecutive wallpaper changes, sound selection and restored Gaia panels on desktop.\n\n### Android · APK\n\n- Build and sign local Preview16; verify shared payload and version. Nothing published in this step.\n- Validate Vulpes as the HOME launcher, restore Gaia locking after sleep and Android Back navigation from the lockscreen camera.\n- Hide Android system bars in immersive mode while retaining temporary swipe access.\n- Android 16/API36 emulator checks: locking, camera/Back, French/English, Home without test apps, wallpaper and sound. Wallpaper retained after force-stop/relaunch with no repeated changes over 15 seconds. Other Android devices not qualified in this step.\n\nThe October 8 camera changes and the later October 6 Wi-Fi, banner and Marketplace theme changes are not included in this APK. Front-camera validation on Sargo remains open. This release concerns Android only." + "summary": "# Vulpes OS — 2.7-preview.17\n\n🇫🇷 Preview expérimentale. L’APK peut être installé par-dessus la Preview précédente. Les appels et SMS passent par Android. Les avancées Sargo ci-dessous sont distinctes de l’APK ; cette release ne fournit pas de nouvelle image pour le Pixel.\n\n🇬🇧 Experimental Preview. Install the APK over the previous Preview. Calls and SMS use Android. Sargo progress below is separate from the APK; this release does not provide a new Pixel image.\n\nAndroid 8 minimum · Essais sur émulateur Android. / Tested on an Android emulator.", + "include_entry": true }, "v2.7-preview.20": { "version": "2.7-preview.20", "after": "2.7-preview.17", "url": "https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.20", - "summary": "# 🇫🇷 Vulpes OS — Preview 20\n\nAPK expérimental et sources communes PC / Android / Tundra mis à jour depuis la Preview 17. Les étapes 18 et 19 sont incluses dans cette version ; aucun ancien APK supplémentaire n’est publié.\n\n- Android 8 / API 26 minimum déclaré, API 37 ciblée. ARM64, ARMv7 et x86_64. Installer l’APK par-dessus une Preview signée avec la même clé conserve ses données.\n- Vérifier le téléchargement avec `sha256sum -c SHA256SUMS.txt`.\n- PC : `./setup.sh`, puis `./run.sh`. Sources Sargo incluses ; cette release ne distribue pas de nouvelle image native.\n- Vulpes 2.7-preview.20 · Gaia 2.7.0 · Gecko PC/Sargo 156.0.1 · GeckoView Android 156.0.\n\nAPK de développement signé, débogage via ADB autorisé. Appels/SMS délégués aux applications Android. Aucun engagement de compatibilité avec tous les appareils ; fonctions matérielles et services distants encore incomplets. L’historique ci-dessous distingue les tests de chaque plateforme.\n\n# 🇬🇧 Vulpes OS — Preview 20\n\nExperimental APK and shared desktop / Android / Tundra sources updated since Preview 17. Stages 18 and 19 are included; no additional older APKs are published.\n\n- Declared minimum Android 8 / API 26, target API 37. ARM64, ARMv7 and x86_64. Installing over a Preview signed with the same key preserves its data.\n- Verify your download with `sha256sum -c SHA256SUMS.txt`.\n- Desktop: `./setup.sh`, then `./run.sh`. Sargo sources included; this release supplies no new native image.\n- Vulpes 2.7-preview.20 · Gaia 2.7.0 · desktop/Sargo Gecko 156.0.1 · Android GeckoView 156.0.\n\nSigned development APK, debugging through authorized ADB. Calls/SMS delegated to Android applications. Not every device is qualified; hardware functions and remote services remain incomplete. The history below separates platform-specific test results.\n" + "summary": "# Vulpes OS — 2.7-preview.20\n\n🇫🇷 Preview expérimentale. L’APK peut être installé par-dessus la Preview précédente. Les appels et SMS passent par Android. Les avancées Sargo ci-dessous sont distinctes de l’APK ; cette release ne fournit pas de nouvelle image pour le Pixel.\n\n🇬🇧 Experimental Preview. Install the APK over the previous Preview. Calls and SMS use Android. Sargo progress below is separate from the APK; this release does not provide a new Pixel image.\n\nAndroid 8 minimum · Exécution de cette Preview sur Android encore à valider. / Android execution of this Preview still needs validation.", + "include_entry": true + }, + "android-2.7-156.0.1": { + "version": "2.7-156.0.1", + "after": "2.7-preview.2", + "url": "https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-156.0.1", + "summary": "# Vulpes OS — 2.7-156.0.1\n\n🇫🇷 Ancienne Preview Android expérimentale. Une version plus récente est disponible dans les releases du projet.\n\n🇬🇧 Older experimental Android Preview. A newer version is available in the project releases.", + "include_entry": true + }, + "android-2.7-preview.2": { + "version": "2.7-preview.2", + "after": "2.7-preview.1", + "url": "https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.2", + "summary": "# Vulpes OS — 2.7-preview.2\n\n🇫🇷 Ancienne Preview Android expérimentale. Une version plus récente est disponible dans les releases du projet.\n\n🇬🇧 Older experimental Android Preview. A newer version is available in the project releases.", + "include_entry": true + }, + "android-2.7-preview.1": { + "version": "2.7-preview.1", + "after": "history", + "url": "https://nnsprod.com/git/oversu/VulpesOS/releases/tag/android-2.7-preview.1", + "summary": "# Vulpes OS — 2.7-preview.1\n\n🇫🇷 Ancienne Preview Android expérimentale. Une version plus récente est disponible dans les releases du projet.\n\n🇬🇧 Older experimental Android Preview. A newer version is available in the project releases.", + "include_entry": true + }, + "v2.7-preview.21": { + "version": "2.7-preview.21", + "after": "2.7-preview.20", + "url": "https://nnsprod.com/git/oversu/VulpesOS/releases/tag/v2.7-preview.21", + "include_entry": true, + "summary": "# Vulpes OS — 2.7-preview.21\n\n🇫🇷 **Preview Android expérimentale.** Contacts, SMS et journal d’appels Android accessibles dans Gaia après autorisation, en lecture seule. Les données locales Vulpes sont conservées. Les MMS ne sont pas synchronisés ; appels, envoi et modification des données Android passent par les applications Android.\n\nInstaller l’APK par-dessus une Preview précédente signée avec la même clé. Android 8 minimum déclaré ; ARM64, ARMv7 et x86_64. Intégration vérifiée sur émulateur Android 9 avec des données de test ; les Motorola signalés et les versions Android récentes restent à qualifier. Le problème de clavier blanc n’est pas considéré comme résolu sur tous les appareils.\n\nBuild de développement signé, débogage via ADB autorisé. Gaia 2.7.0 · GeckoView Android 156.0. Vérification du téléchargement : `sha256sum -c SHA256SUMS.txt`. **Aucune nouvelle image Pixel n’est publiée ici : son flash et ses tests restent à effectuer.**\n\n🇬🇧 **Experimental Android Preview.** Android contacts, SMS and call history can be read in Gaia after granting permission. Local Vulpes data is preserved. MMS are not synchronized; calls, sending and editing Android records use Android apps.\n\nInstall over a previous Preview signed with the same key. Declared minimum Android 8; ARM64, ARMv7 and x86_64. Integration checked on an Android 9 emulator with test data; reported Motorola devices and recent Android versions still need qualification. The blank keyboard issue is not considered fixed on every device.\n\nSigned development build, debugging through authorized ADB. Gaia 2.7.0 · Android GeckoView 156.0. Verify the download with `sha256sum -c SHA256SUMS.txt`. **No new Pixel image is published here: flashing and hardware tests are still pending.**\n" } } } diff --git a/gaia/apps/communications/dialer/js/call_log.js b/gaia/apps/communications/dialer/js/call_log.js index a738f2dc..23416745 100755 --- a/gaia/apps/communications/dialer/js/call_log.js +++ b/gaia/apps/communications/dialer/js/call_log.js @@ -265,8 +265,7 @@ var CallLog = { // If the contacts cache is not valid, we retrieve the contacts information // directly from the contacts API and update the DOM accordingly. if (!this._contactCache) { - this.updateListWithContactInfo(null, null, phoneNumbers, - logGroupContainer); + this.updateListWithContactInfo(null, null, logGroupContainer); } }, diff --git a/gaia/apps/keyboard/js/settings/layout_dictionary_downloader.js b/gaia/apps/keyboard/js/settings/layout_dictionary_downloader.js index c1422c4f..b10c5e61 100755 --- a/gaia/apps/keyboard/js/settings/layout_dictionary_downloader.js +++ b/gaia/apps/keyboard/js/settings/layout_dictionary_downloader.js @@ -9,10 +9,9 @@ var LayoutDictionaryDownloader = function(imEngineId, dictFilename) { this._xhr = null; }; -// Remote URLs to download the data. We require the remote server to have -// CORS turned on since we are not asking for SystemXHR permission. +// Dictionaries ship with Vulpes so adding a layout also works offline. LayoutDictionaryDownloader.prototype.REMOTE_URL = - 'https://fxos.cdn.mozilla.net/dictionaries/%imEngineId/%ver/%dictFilename'; + '/js/imes/%imEngineId/dictionaries/%dictFilename'; // If the data schema changes in an incompatible way, we must bump the // version-to-download here. diff --git a/gaia/apps/marketplace/marketplace.js b/gaia/apps/marketplace/marketplace.js index 84dbc0c5..b00ac828 100644 --- a/gaia/apps/marketplace/marketplace.js +++ b/gaia/apps/marketplace/marketplace.js @@ -6,6 +6,12 @@ function labels(){document.getElementById('browse').textContent=text('Ouvrir le catalogue','Open catalogue');document.getElementById('open').textContent=text('Ouvrir','Open');document.getElementById('install').textContent=text('Installer','Install');document.getElementById('cancel').textContent=text('Annuler','Cancel');} function loadFailed(){status(text('Catalogue inaccessible. Vérifiez la connexion Internet, puis réessayez.','Catalogue unavailable. Check your Internet connection, then try again.'));document.getElementById('open').hidden=true;} frame.addEventListener('mozbrowsererror',loadFailed); + frame.addEventListener('mozbrowserclose',()=>{ + if(busy)return; + status(text('Le catalogue est fermé. Vous pouvez le rouvrir ci-dessous.', + 'The catalogue is closed. You can reopen it below.')); + document.getElementById('open').hidden=true; + }); function browse(){labels();message.hidden=true;dialog.hidden=true;frame.style.visibility='visible';frame.src='https://vulpes-os.org/marketplace/?mode=app&lang='+(fr()?'fr':'en');} function status(value){frame.style.visibility='hidden';message.hidden=false;document.getElementById('status').textContent=value;} async function prepare(url){ diff --git a/gaia/apps/settings/js/modules/panel_cache.js b/gaia/apps/settings/js/modules/panel_cache.js index a5b558af..df481e13 100755 --- a/gaia/apps/settings/js/modules/panel_cache.js +++ b/gaia/apps/settings/js/modules/panel_cache.js @@ -86,7 +86,16 @@ define(function(require) { var path = pathElement ? pathElement.dataset.path : null; var panelFuncLoaded = function(panelFunc) { - var panel = panelFunc(); + var panel; + try { + panel = panelFunc(); + if (!panel || typeof panel.beforeShow !== 'function') { + throw new TypeError('Invalid settings panel: ' + panelId); + } + } catch (error) { + if (callback) callback(null, error); + return; + } _panelCache[panelId] = panel; if (callback) { callback(panel); @@ -97,6 +106,8 @@ define(function(require) { require([path], function(panelFunc) { // Create a new panel object for static panels. panelFuncLoaded(panelFunc ? panelFunc : SettingsPanel); + }, function(error) { + if (callback) callback(null, error); }); } else { panelFuncLoaded(SettingsPanel); diff --git a/gaia/apps/settings/js/modules/settings_service.js b/gaia/apps/settings/js/modules/settings_service.js index 767adbef..e9219b1b 100755 --- a/gaia/apps/settings/js/modules/settings_service.js +++ b/gaia/apps/settings/js/modules/settings_service.js @@ -187,7 +187,12 @@ define(function(require) { } _loadPanel(panelId, function() { - PanelCache.get(panelId, function(panel) { + PanelCache.get(panelId, function(panel, loadError) { + if (loadError || !panel) { + console.error('Settings panel ' + panelId + ':', loadError); + callback(loadError || new Error('Missing settings panel: ' + panelId)); + return; + } var newPanelElement = document.getElementById(panelId); var currentPanelId = _currentNavigation && _currentNavigation.panelId; diff --git a/gaia/apps/settings/js/startup.js b/gaia/apps/settings/js/startup.js index ae98e120..18478b09 100755 --- a/gaia/apps/settings/js/startup.js +++ b/gaia/apps/settings/js/startup.js @@ -408,14 +408,13 @@ var appStarter = AppStarter(); - if (document.readyState !== 'loading') { + // Deferred Gaia components contain UMD wrappers. Finish loading them before + // Alameda starts, otherwise an anonymous component can become a panel module. + if (document.readyState === 'complete') { appStarter.start(); } else { - document.addEventListener('readystatechange', function readyStateChange() { - if (document.readyState == 'interactive') { - document.removeEventListener('readystatechange', readyStateChange); - appStarter.start(); - } - }); + document.addEventListener('DOMContentLoaded', function() { + appStarter.start(); + }, { once: true }); } })(); diff --git a/host/gaia-input.js b/host/gaia-input.js index 59f6c7e3..25c0524a 100644 --- a/host/gaia-input.js +++ b/host/gaia-input.js @@ -55,8 +55,15 @@ ime.dispatchEvent(new Event('inputcontextchange')); }; Object.defineProperty(navigator,'mozInputMethod',{value:ime}); - addEventListener('vulpes-service-event',({detail})=>{if(detail.type==='input-focus')setState(detail.data);}); - call('input.request',{operation:'state'}).then(setState).catch(console.error); + let focusReceived=false; + addEventListener('vulpes-service-event',({detail})=>{ + if(detail.type==='input-focus') {focusReceived=true;setState(detail.data);} + }); + // A focus event can arrive while the initial state request is in flight. + // Its older snapshot must not clear or reopen the newer input context. + call('input.request',{operation:'state'}).then(state=>{ + if(!focusReceived)setState(state); + }).catch(console.error); window.resizeTo=(_width,height)=>call('input.request',{operation:'height',height}).catch(console.error); } if(app==='system') { diff --git a/host/gaia-theme.css b/host/gaia-theme.css index 1d91c0bf..b2432989 100644 --- a/host/gaia-theme.css +++ b/host/gaia-theme.css @@ -103,3 +103,25 @@ background-color: var(--vulpes-surface) !important; color: var(--vulpes-text) !important; } + +/* Keep the message and its surface paired, including lazily loaded Gaia dialogs. */ +:root #vulpes-gaia-notice, +:root #vulpes-gaia-notice > section, +:root #vulpes-gaia-notice > section > p { + background-color: #f4f4f4 !important; + color: #202b33 !important; +} +:root[data-vulpes-theme="dark"] #vulpes-gaia-notice, +:root[data-vulpes-theme="dark"] #vulpes-gaia-notice > section, +:root[data-vulpes-theme="dark"] #vulpes-gaia-notice > section > p { + background-color: var(--vulpes-surface) !important; + color: var(--vulpes-text) !important; +} +:root[data-vulpes-app="settings"] p[data-vulpes-unavailable] { + background-color: #f4f4f4 !important; + color: #202b33 !important; +} +:root[data-vulpes-theme="dark"][data-vulpes-app="settings"] p[data-vulpes-unavailable] { + background-color: var(--vulpes-surface) !important; + color: var(--vulpes-text) !important; +} diff --git a/overrides/keyboard.gaiamobile.org/gaia_build_defer_settings.js b/overrides/keyboard.gaiamobile.org/gaia_build_defer_settings.js new file mode 100644 index 00000000..fb7b4e10 --- /dev/null +++ b/overrides/keyboard.gaiamobile.org/gaia_build_defer_settings.js @@ -0,0 +1,966 @@ +;window.COMPONENTS_BASE_URL='/shared/elements/';;(function(exports){'use strict';exports.ComponentUtils={style:function(baseUrl){if(window.VulpesCompat){window.VulpesCompat.componentStyle(this,baseUrl).catch(console.error);return;}var style=document.createElement('style');var url=baseUrl+'style.css';var self=this;style.setAttribute('scoped','');style.innerHTML='@import url('+url+');';this.appendChild(style);this.style.visibility='hidden';style.addEventListener('load',function(){if(self.shadowRoot){self.shadowRoot.appendChild(style.cloneNode(true));} +self.style.visibility='';});}};}(window));;(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.GaiaHeader=f()}})(function(){var define,module,exports;return(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;ospace&&fontSize!==min&&fontSize--);return{textWidth:textWidth,fontSize:fontSize,overflowing:textWidth>space};};function getTextWidth(text,font){var ctx=getCanvasContext(font);var width=ctx.measureText(text).width;debug('got text width',width);return width;} +function getCanvasContext(font){debug('get canvas context',font);var cached=cache[font];if(cached){return cached;} +var canvas=document.createElement('canvas');canvas.setAttribute('moz-opaque','true');canvas.setAttribute('width','1px');canvas.setAttribute('height','1px');debug('created canvas',canvas);var ctx=canvas.getContext('2d',{willReadFrequently:true});ctx.font=font;return cache[font]=ctx;} +function trim(text){return text.replace(/\s+/g,' ').trim();}});})(typeof define=='function'&&define.amd?define:(function(n,w){'use strict';return typeof module=='object'?function(c){c(require,exports,module);}:function(c){var m={exports:{}};c(function(n){return w[n];},m.exports,m);w[n]=m.exports;};})('font-fit',this));},{}],2:[function(require,module,exports){;(function(define){'use strict';define(function(require,exports,module){var textContent=Object.getOwnPropertyDescriptor(Node.prototype,'textContent');var innerHTML=Object.getOwnPropertyDescriptor(Element.prototype,'innerHTML');var removeAttribute=Element.prototype.removeAttribute;var setAttribute=Element.prototype.setAttribute;var noop=function(){};exports.register=function(name,props){var baseProto=getBaseProto(props.extends);var template=props.template||baseProto.templateString;var extensible=props.extensible=props.hasOwnProperty('extensible')?props.extensible:true;delete props.extends;if(template){if(extensible&&props.template){props.templateString=props.template;} +var output=processCss(template,name);props.template=document.createElement('template');props.template.innerHTML=output.template;props.lightCss=output.lightCss;props.globalCss=props.globalCss||'';props.globalCss+=output.globalCss;} +injectGlobalCss(props.globalCss);delete props.globalCss;var descriptors=mixin(props.attrs||{},base.descriptors);props._attrs=props.attrs;delete props.attrs;var proto=createProto(baseProto,props);Object.defineProperties(proto,descriptors);try{return document.registerElement(name,{prototype:proto});}catch(e){if(e.name!=='NotSupportedError'){throw e;}}};var base={properties:{GaiaComponent:true,attributeChanged:noop,attached:noop,detached:noop,created:noop,createdCallback:function(){if(this.dirObserver){addDirObserver();} +injectLightCss(this);this.created();},attributeChangedCallback:function(name,from,to){var prop=toCamelCase(name);if(this._attrs&&this._attrs[prop]){this[prop]=to;} +this.attributeChanged(name,from,to);},attachedCallback:function(){if(this.dirObserver){this.setInnerDirAttributes=setInnerDirAttributes.bind(null,this);document.addEventListener('dirchanged',this.setInnerDirAttributes);} +this.attached();},detachedCallback:function(){if(this.dirObserver){document.removeEventListener('dirchanged',this.setInnerDirAttributes);} +this.detached();},setupShadowRoot:function(){if(!this.template){return;} +var node=document.importNode(this.template.content,true);this.createShadowRoot().appendChild(node);if(this.dirObserver){setInnerDirAttributes(this);} +return this.shadowRoot;},setAttr:function(name,value){var internal=this.shadowRoot.firstElementChild;setAttribute.call(internal,name,value);setAttribute.call(this,name,value);},removeAttr:function(name){var internal=this.shadowRoot.firstElementChild;removeAttribute.call(internal,name);removeAttribute.call(this,name);}},descriptors:{textContent:{set:function(value){textContent.set.call(this,value);if(this.lightStyle){this.appendChild(this.lightStyle);}},get:function(){return textContent.get();}},innerHTML:{set:function(value){innerHTML.set.call(this,value);if(this.lightStyle){this.appendChild(this.lightStyle);}},get:innerHTML.get}}};var defaultPrototype=createProto(HTMLElement.prototype,base.properties);function getBaseProto(proto){if(!proto){return defaultPrototype;} +proto=proto.prototype||proto;return!proto.GaiaComponent?createProto(proto,base.properties):proto;} +function createProto(proto,props){return mixin(Object.create(proto),props);} +var hasShadowCSS=(function(){var div=document.createElement('div');try{div.querySelector(':host');div.querySelector('::content');return true;} +catch(e){return false;}})();var regex={shadowCss:/(?:\:host|\:\:content)[^{]*\{[^}]*\}/g,':host':/(?:\:host)/g,':host()':/\:host\((.+)\)(?: \:\:content)?/g,':host-context':/\:host-context\((.+)\)([^{,]+)?/g,'::content':/(?:\:\:content)/g};function processCss(template,name){var globalCss='';var lightCss='';if(!hasShadowCSS){template=template.replace(regex.shadowCss,function(match){var hostContext=regex[':host-context'].exec(match);if(hostContext){globalCss+=match.replace(regex['::content'],'').replace(regex[':host-context'],'$1 '+name+'$2').replace(/ +/g,' ');}else{lightCss+=match.replace(regex[':host()'],name+'$1').replace(regex[':host'],name).replace(regex['::content'],name);} +return'';});} +return{template:template,lightCss:lightCss,globalCss:globalCss};} +function injectGlobalCss(css){if(!css){return;} +var style=document.createElement('style');style.innerHTML=css.trim();headReady().then(function(){document.head.appendChild(style);});} +function headReady(){return new Promise(function(resolve){if(document.head){return resolve();} +window.addEventListener('load',function fn(){window.removeEventListener('load',fn);resolve();});});} +function injectLightCss(el){if(hasShadowCSS){return;} +var stylesheet=el.querySelector('style');if(!stylesheet){stylesheet=document.createElement('style');stylesheet.setAttribute('scoped','');stylesheet.appendChild(document.createTextNode(el.lightCss));el.appendChild(stylesheet);} +el.lightStyle=stylesheet;} +function toCamelCase(string){return string.replace(/-(.)/g,function replacer(string,p1){return p1.toUpperCase();});} +var dirObserver;function setInnerDirAttributes(component){var dir=component.dir||document.dir;Array.from(component.shadowRoot.children).forEach(element=>{if(element.nodeName!=='STYLE'){element.dir=dir;}});} +function addDirObserver(){if(dirObserver){return;} +dirObserver=new MutationObserver(onChanged);dirObserver.observe(document.documentElement,{attributeFilter:['dir'],attributes:true});function onChanged(mutations){document.dispatchEvent(new Event('dirchanged'));}} +function mixin(target,source){for(var key in source){target[key]=source[key];} +return target;}});})(typeof define=='function'&&define.amd?define:(function(n,w){'use strict';return typeof module=='object'?function(c){c(require,exports,module);}:function(c){var m={exports:{}};c(function(n){return w[n];},m.exports,m);w[n]=m.exports;};})('gaia-component',this));},{}],3:[function(require,module,exports){(function(define){'use strict';define(function(require,exports,module){var base=window.GAIA_ICONS_BASE_URL||window.COMPONENTS_BASE_URL||'bower_components/';if(!document.documentElement){window.addEventListener('load',load);}else{load();} +function load(){if(isLoaded()){return;} +var link=document.createElement('link');link.rel='stylesheet';link.type='text/css';link.href=base+'gaia-icons/gaia-icons.css';document.head.appendChild(link);exports.loaded=true;} +function isLoaded(){return exports.loaded||document.querySelector('link[href*=gaia-icons]')||document.documentElement.classList.contains('gaia-icons-loaded');}});})(typeof define=='function'&&define.amd?define:(function(n,w){'use strict';return typeof module=='object'?function(c){c(require,exports,module);}:function(c){var m={exports:{}};c(function(n){return w[n];},m.exports,m);w[n]=m.exports;};})('gaia-icons',this));},{}],4:[function(require,module,exports){;(function(define){'use strict';define(function(require,exports,module){var component=require('gaia-component');var fontFit=require('font-fit');require('gaia-icons');var debug=0?console.log.bind(console):function(){};const KNOWN_ACTIONS={menu:'menu',back:'back',close:'close'};const TITLE_FONT='italic 300 24px FiraSans';const TITLE_PADDING=10;const MINIMUM_FONT_SIZE_CENTERED=20;const MINIMUM_FONT_SIZE_UNCENTERED=16;const MAXIMUM_FONT_SIZE=23;module.exports=component.register('gaia-header',{extensible:false,dirObserver:true,created:function(){debug('created');this.setupShadowRoot();this.els={actionButton:this.shadowRoot.querySelector('.action-button'),titles:this.getElementsByTagName('h1')};this.els.actionButton.addEventListener('click',e=>this.onActionButtonClick(e));this.observer=new MutationObserver(this.onMutation.bind(this));this.ignoreDir=this.hasAttribute('ignore-dir');this.titleEnd=this.getAttribute('title-end');this.titleStart=this.getAttribute('title-start');this.noFontFit=this.getAttribute('no-font-fit');this.notFlush=this.hasAttribute('not-flush');this.action=this.getAttribute('action');this.unresolved={};this.pending={};this._resizeThrottlingId=null;this.onResize=this.onResize.bind(this);},attached:function(){debug('attached');this.runFontFitSoon();this.observerStart();window.addEventListener('resize',this.onResize);},detached:function(){debug('detached');window.removeEventListener('resize',this.onResize);this.observerStop();this.clearPending();},clearPending:function(){for(var key in this.pending){this.pending[key].clear();delete this.pending[key];} +window.cancelAnimationFrame(this._resizeThrottlingId);this._resizeThrottlingId=null;},runFontFit:function(){debug('run font-fit');if(this.noFontFit){return Promise.resolve();} +var titles=this.els.titles;var space=this.getTitleSpace();var styles=[].map.call(titles,el=>this.getTitleStyle(el,space));return this.setTitleStylesSoon(styles);},runFontFitSoon:function(){debug('run font-fit soon');if(this.pending.runFontFitSoon){return;} +this.pending.runFontFitSoon=this.nextTick(()=>{delete this.pending.runFontFitSoon;this.runFontFit();});},getTitleStyle:function(el,space){debug('get el style',el,space);var text=el.textContent;var styleId=space.start+text+space.end+'#'+space.value;if(!text||!text.trim()){return debug('exit: no text');} +if(getStyleId(el)===styleId){return debug('exit: no change');} +var marginStart=this.getTitleMarginStart();var textSpace=space.value-Math.abs(marginStart);var fontFitResult=this.fontFit(text,textSpace,{min:MINIMUM_FONT_SIZE_CENTERED});var overflowing=fontFitResult.overflowing;var padding={start:0,end:0};if(overflowing){debug('title overflowing');padding.start=!space.start?TITLE_PADDING:0;padding.end=!space.end?TITLE_PADDING:0;textSpace=space.value-padding.start-padding.end;fontFitResult=this.fontFit(text,textSpace);marginStart=0;} +return{id:styleId,fontSize:fontFitResult.fontSize,marginStart:marginStart,overflowing:overflowing,padding:padding};},setTitleStylesSoon:function(styles){debug('set title styles soon',styles);var key='setStyleTitlesSoon';this._titleStyles=styles;if(this.unresolved[key]){return this.unresolved[key];} +this.unresolved[key]=new Promise((resolve)=>{this.pending[key]=this.nextTick(()=>{var styles=this._titleStyles;var els=this.els.titles;[].forEach.call(els,(el,i)=>{if(!styles[i]){return debug('exit');} +this.setTitleStyle(el,styles[i]);});delete this._titleStyles;delete this.unresolved[key];delete this.pending[key];resolve();});});},setTitleStyle:function(el,style){debug('set title style',style);this.observerStop();if(this.ignoreDir){el.style.marginLeft=style.marginStart+'px';el.style.paddingLeft=style.padding.start+'px';el.style.paddingRight=style.padding.end+'px';}else{el.style.marginInlineStart=style.marginStart+'px';el.style.paddingInlineStart=style.padding.start+'px';el.style.paddingInlineEnd=style.padding.end+'px';} +el.style.fontSize=style.fontSize+'px';setStyleId(el,style.id);this.observerStart();},fontFit:function(text,space,opts={}){debug('font fit:',text,space,opts);var fontFitArgs={font:TITLE_FONT,min:opts.min||MINIMUM_FONT_SIZE_UNCENTERED,max:MAXIMUM_FONT_SIZE,text:text,space:space};return fontFit(fontFitArgs);},observerStart:function(){if(this.observing){return;} +this.observer.observe(this,{childList:true,attributes:true,subtree:true});this.observing=true;debug('observer started');},observerStop:function(){if(!this.observing){return;} +this.observer.disconnect();this.observing=false;debug('observer stopped');},onResize:function(e){debug('onResize',this._resizeThrottlingId);if(this._resizeThrottlingId!==null){return;} +this._resizeThrottlingId=window.requestAnimationFrame(()=>{this._resizeThrottlingId=null;this.runFontFitSoon();});},onMutation:function(mutations){debug('on mutation',mutations);if(!this.pending.runFontFitSoon){this.runFontFit();}},getTitleSpace:function(){var start=this.titleStart;var end=this.titleEnd;var space=this.getWidth()-start-end;var result={value:space,start:start,end:end};debug('get title space',result);return result;},getWidth:function(){var value=this.notFlush?this.clientWidth:window.innerWidth;debug('get width',value);return value;},triggerAction:function(){if(this.action){this.els.actionButton.click();}},onActionButtonClick:function(){debug('action button click');var config={detail:{type:this.action}};var e=new CustomEvent('action',config);setTimeout(()=>this.dispatchEvent(e));},getTitleMarginStart:function(){var start=this.titleStart;var end=this.titleEnd;var marginStart=end-start;debug('get title margin start',marginStart);return marginStart;},getButtonsBeforeTitle:function(){var children=this.children;var l=children.length;var els=[];for(var i=0;i=0;i--){var el=children[i];if(el.tagName==='H1'){break;} +if(!contributesToLayout(el)){continue;} +els.push(el);} +return els;},sumButtonWidths:function(buttons){var defaultWidth=50;var sum=buttons.reduce((prev,button)=>{var isStandardButton=button===this.els.actionButton;var width=isStandardButton?defaultWidth:button.clientWidth;return prev+width;},0);debug('sum button widths',buttons,sum);return sum;},attrs:{action:{get:function(){return this._action;},set:function(value){var action=KNOWN_ACTIONS[value];if(action===this._action){return;} +this.setAttr('action',action);this._action=action;}},titleStart:{get:function(){debug('get title-start');if('_titleStart'in this){return this._titleStart;} +var buttons=this.getButtonsBeforeTitle();var value=this.sumButtonWidths(buttons);debug('get title-start',buttons,value);return value;},set:function(value){debug('set title-start',value);value=parseInt(value,10);if(value===this._titleStart||isNaN(value)){return;} +this.setAttr('title-start',value);this._titleStart=value;debug('set');}},titleEnd:{get:function(){debug('get title-end');if('_titleEnd'in this){return this._titleEnd;} +var buttons=this.getButtonsAfterTitle();return this.sumButtonWidths(buttons);},set:function(value){debug('set title-end',value);value=parseInt(value,10);if(value===this._titleEnd||isNaN(value)){return;} +this.setAttr('title-end',value);this._titleEnd=value;}},noFontFit:{get:function(){return this._noFontFit||false;},set:function(value){debug('set no-font-fit',value);value=!!(value||value==='');if(value===this.noFontFit){return;} +this._noFontFit=value;if(value){this.setAttr('no-font-fit','');} +else{this.removeAttr('no-font-fit');}}},ignoreDir:{get:function(){return this._ignoreDir||false;},set:function(value){debug('set ignore-dir',value);value=!!(value||value==='');if(value===this.ignoreDir){return;} +this._ignoreDir=value;this.dirObserver=!value;if(value){this.setAttr('ignore-dir','');} +else{this.removeAttr('ignore-dir');}}}},template:`
+ + +
+ + `,nextTick:nextTick});function contributesToLayout(el){return el.localName!=='style'&&!el.hasAttribute('l10n-action');} +function setStyleId(el,id){el._styleId=id;} +function getStyleId(el){return el._styleId;} +function nextTick(fn){var cleared;Promise.resolve().then(()=>{if(!cleared){fn();}});return{clear:function(){cleared=true;}};}});})(typeof define=='function'&&define.amd?define:(function(n,w){'use strict';return typeof module=='object'?function(c){c(require,exports,module);}:function(c){var m={exports:{}};c(function(n){return w[n];},m.exports,m);w[n]=m.exports;};})('gaia-header',this));},{"font-fit":1,"gaia-component":2,"gaia-icons":3}]},{},[4])(4)});;;(function(define){'use strict';define(function(require,exports,module){var textContent=Object.getOwnPropertyDescriptor(Node.prototype,'textContent');var innerHTML=Object.getOwnPropertyDescriptor(Element.prototype,'innerHTML');var removeAttribute=Element.prototype.removeAttribute;var setAttribute=Element.prototype.setAttribute;var noop=function(){};exports.register=function(name,props){var baseProto=getBaseProto(props.extends);var template=props.template||baseProto.templateString;var extensible=props.extensible=props.hasOwnProperty('extensible')?props.extensible:true;delete props.extends;if(template){if(extensible&&props.template){props.templateString=props.template;} +var output=processCss(template,name);props.template=document.createElement('template');props.template.innerHTML=output.template;props.lightCss=output.lightCss;props.globalCss=props.globalCss||'';props.globalCss+=output.globalCss;} +injectGlobalCss(props.globalCss);delete props.globalCss;var descriptors=mixin(props.attrs||{},base.descriptors);props._attrs=props.attrs;delete props.attrs;var proto=createProto(baseProto,props);Object.defineProperties(proto,descriptors);try{return document.registerElement(name,{prototype:proto});}catch(e){if(e.name!=='NotSupportedError'){throw e;}}};var base={properties:{GaiaComponent:true,attributeChanged:noop,attached:noop,detached:noop,created:noop,createdCallback:function(){if(this.dirObserver){addDirObserver();} +injectLightCss(this);this.created();},attributeChangedCallback:function(name,from,to){var prop=toCamelCase(name);if(this._attrs&&this._attrs[prop]){this[prop]=to;} +this.attributeChanged(name,from,to);},attachedCallback:function(){if(this.dirObserver){this.setInnerDirAttributes=setInnerDirAttributes.bind(null,this);document.addEventListener('dirchanged',this.setInnerDirAttributes);} +this.attached();},detachedCallback:function(){if(this.dirObserver){document.removeEventListener('dirchanged',this.setInnerDirAttributes);} +this.detached();},setupShadowRoot:function(){if(!this.template){return;} +var node=document.importNode(this.template.content,true);this.createShadowRoot().appendChild(node);if(this.dirObserver){setInnerDirAttributes(this);} +return this.shadowRoot;},setAttr:function(name,value){var internal=this.shadowRoot.firstElementChild;setAttribute.call(internal,name,value);setAttribute.call(this,name,value);},removeAttr:function(name){var internal=this.shadowRoot.firstElementChild;removeAttribute.call(internal,name);removeAttribute.call(this,name);}},descriptors:{textContent:{set:function(value){textContent.set.call(this,value);if(this.lightStyle){this.appendChild(this.lightStyle);}},get:function(){return textContent.get();}},innerHTML:{set:function(value){innerHTML.set.call(this,value);if(this.lightStyle){this.appendChild(this.lightStyle);}},get:innerHTML.get}}};var defaultPrototype=createProto(HTMLElement.prototype,base.properties);function getBaseProto(proto){if(!proto){return defaultPrototype;} +proto=proto.prototype||proto;return!proto.GaiaComponent?createProto(proto,base.properties):proto;} +function createProto(proto,props){return mixin(Object.create(proto),props);} +var hasShadowCSS=(function(){var div=document.createElement('div');try{div.querySelector(':host');div.querySelector('::content');return true;} +catch(e){return false;}})();var regex={shadowCss:/(?:\:host|\:\:content)[^{]*\{[^}]*\}/g,':host':/(?:\:host)/g,':host()':/\:host\((.+)\)(?: \:\:content)?/g,':host-context':/\:host-context\((.+)\)([^{,]+)?/g,'::content':/(?:\:\:content)/g};function processCss(template,name){var globalCss='';var lightCss='';if(!hasShadowCSS){template=template.replace(regex.shadowCss,function(match){var hostContext=regex[':host-context'].exec(match);if(hostContext){globalCss+=match.replace(regex['::content'],'').replace(regex[':host-context'],'$1 '+name+'$2').replace(/ +/g,' ');}else{lightCss+=match.replace(regex[':host()'],name+'$1').replace(regex[':host'],name).replace(regex['::content'],name);} +return'';});} +return{template:template,lightCss:lightCss,globalCss:globalCss};} +function injectGlobalCss(css){if(!css){return;} +var style=document.createElement('style');style.innerHTML=css.trim();headReady().then(function(){document.head.appendChild(style);});} +function headReady(){return new Promise(function(resolve){if(document.head){return resolve();} +window.addEventListener('load',function fn(){window.removeEventListener('load',fn);resolve();});});} +function injectLightCss(el){if(hasShadowCSS){return;} +var stylesheet=el.querySelector('style');if(!stylesheet){stylesheet=document.createElement('style');stylesheet.setAttribute('scoped','');stylesheet.appendChild(document.createTextNode(el.lightCss));el.appendChild(stylesheet);} +el.lightStyle=stylesheet;} +function toCamelCase(string){return string.replace(/-(.)/g,function replacer(string,p1){return p1.toUpperCase();});} +var dirObserver;function setInnerDirAttributes(component){var dir=component.dir||document.dir;Array.from(component.shadowRoot.children).forEach(element=>{if(element.nodeName!=='STYLE'){element.dir=dir;}});} +function addDirObserver(){if(dirObserver){return;} +dirObserver=new MutationObserver(onChanged);dirObserver.observe(document.documentElement,{attributeFilter:['dir'],attributes:true});function onChanged(mutations){document.dispatchEvent(new Event('dirchanged'));}} +function mixin(target,source){for(var key in source){target[key]=source[key];} +return target;}});})(typeof define=='function'&&define.amd?define:(function(n,w){'use strict';return typeof module=='object'?function(c){c(require,exports,module);}:function(c){var m={exports:{}};c(function(n){return w[n];},m.exports,m);w[n]=m.exports;};})('gaia-component',this));;;(function(define){define(function(require,exports,module){'use strict';var component=require('gaia-component');module.exports=component.register('gaia-toast',{created:function(){this.setupShadowRoot();this.els={inner:this.shadowRoot.querySelector('.inner'),bread:this.shadowRoot.querySelector('.bread')};this.timeout=this.getAttribute('timeout');},show:function(){this.els.bread.removeEventListener('animationend',this.onAnimateOutEnd);clearTimeout(this.hideTimeout);this.els.inner.classList.add('visible');var reflow=this.els.inner.offsetTop;this.els.bread.classList.remove('animate-out');this.els.bread.classList.add('animate-in');this.hideTimeout=setTimeout(this.hide.bind(this),this.timeout);},hide:function(){var self=this;clearTimeout(this.hideTimeout);this.els.bread.classList.remove('animate-in');this.els.bread.classList.add('animate-out');this.els.bread.removeEventListener('animationend',this.onAnimateOutEnd);this.onAnimateOutEnd=function(){self.els.bread.removeEventListener('animationend',self.onAnimateOutEnd);self.els.bread.classList.remove('animate-out');self.els.inner.classList.remove('visible');};this.els.bread.addEventListener('animationend',this.onAnimateOutEnd);},animateOut:function(){},attrs:{timeout:{get:function(){return this.getAttribute('timeout')||1000;},set:function(value){var current=this.getAttribute('timeout');if(current==value){return;} +else if(!value){this.removeAttribute('timeout');} +else{this.setAttribute('timeout',value);}}}},template:` +
+
+ +
+
+ + + `,globalCss:` + @keyframes gaia-toast-enter { + 0% { + transform: translateY(100%); + opacity: 0; + } + + 40% { + opacity: 0; + } + + 100% { + transform: translateY(0%); + opacity: 1; + } + } + + @keyframes gaia-toast-leave { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } + } + `});});})(typeof define=='function'&&define.amd?define:(function(n,w){'use strict';return typeof module=='object'?function(c){c(require,exports,module);}:function(c){var m={exports:{}};c(function(n){return w[n];},m.exports,m);w[n]=m.exports;};})('gaia-toast',this));;'use strict';window.GaiaSubheader=(function(win){var proto=Object.create(HTMLElement.prototype);var baseurl=window.GaiaSubheaderBaseurl||'/shared/elements/gaia_subheader/';proto.createdCallback=function(){ComponentUtils.style.call(this,baseurl);};return document.registerElement('gaia-subheader',{prototype:proto});})(window);;'use strict';window.GaiaButtons=(function(win){var proto=Object.create(HTMLElement.prototype);var baseurl=window.GaiaButtonsBaseurl||'/shared/elements/gaia_buttons/';proto.createdCallback=function(){ComponentUtils.style.call(this,baseurl);};return document.registerElement('gaia-buttons',{prototype:proto});})(window);;'use strict';window.GaiaCheckbox=(function(win){var proto=Object.create(HTMLElement.prototype);var baseurl=window.GaiaCheckboxBaseurl||'/shared/elements/gaia_checkbox/';proto.createdCallback=function(){this.lastClick=0;this.throttleTime=250;var shadow=this.createShadowRoot();this._template=template.content.cloneNode(true);this._wrapper=this._template.getElementById('checkbox');this._wrapper.addEventListener('click',this.handleClick.bind(this));this.configureClass();this.checked=this.hasAttribute('checked');this._wrapper.setAttribute('aria-checked',this.checked);this.setAttribute('role','presentation');shadow.appendChild(this._template);ComponentUtils.style.call(this,baseurl);};proto.handleClick=function(e){e.preventDefault();e.stopImmediatePropagation();if(this.lastClick+this.throttleTime>Date.now()){return;} +this.lastClick=Date.now();var event=new MouseEvent('click',{view:window,bubbles:true,cancelable:true});this.dispatchEvent(event);if(!event.defaultPrevented){this.checked=!this.checked;this._wrapper.setAttribute('aria-checked',this.checked);} +this.dispatchEvent(new CustomEvent('change',{bubbles:true,cancelable:false}));};proto.configureClass=function(){this._wrapper.className=this.className;};proto.attributeChangedCallback=function(name,from,to){if(name==='class'){this._wrapper.className=to;}};Object.defineProperty(proto,'checked',{get:function(){return this._checked||false;},set:function(value){this._wrapper.classList.toggle('checked',value);this._checked=value;}});Object.defineProperty(proto,'name',{get:function(){return this.getAttribute('name');},set:function(value){this.setAttribute('name',value);}});var template=document.createElement('template');template.innerHTML=` + + `;return document.registerElement('gaia-checkbox',{prototype:proto});})(window);;'use strict';window.GaiaConfirm=(function(win){var proto=Object.create(HTMLElement.prototype);var baseurl=window.GaiaConfirmBaseurl||'/shared/elements/gaia_confirm/';function eatEvent(unless,event){if(unless&&unless.indexOf(event.target)!==-1){return;} +event.preventDefault();event.stopImmediatePropagation();} +proto.createdCallback=function(){var shadow=this.createShadowRoot();this._template=template.content.cloneNode(true);shadow.appendChild(this._template);ComponentUtils.style.call(this,baseurl);var confirm=this.querySelector('gaia-buttons .confirm');var cancel=this.querySelector('gaia-buttons .cancel');if(confirm){confirm.addEventListener('click',(e)=>{eatEvent(null,e);this.dispatchEvent(new CustomEvent('confirm'));});} +if(cancel){cancel.addEventListener('click',(e)=>{eatEvent(null,e);this.dispatchEvent(new CustomEvent('cancel'));});}};var template=document.createElement('template');template.innerHTML=``;return document.registerElement('gaia-confirm',{prototype:proto});})(window);;(function(window,undefined){'use strict';function L10nError(message,id,loc){this.name='L10nError';this.message=message;this.id=id;this.loc=loc;} +L10nError.prototype=Object.create(Error.prototype);L10nError.prototype.constructor=L10nError;var io={_load:function(type,url,callback,sync){var xhr=new XMLHttpRequest();var needParse;if(xhr.overrideMimeType){xhr.overrideMimeType(type);} +xhr.open('GET',url,!sync);if(type==='application/json'){if(sync){needParse=true;}else{xhr.responseType='json';}} +xhr.addEventListener('load',function io_onload(e){if(e.target.status===200||e.target.status===0){var res=e.target.response||e.target.responseText;callback(null,needParse?JSON.parse(res):res);}else{callback(new L10nError('Not found: '+url));}});xhr.addEventListener('error',callback);xhr.addEventListener('timeout',callback);try{xhr.send(null);}catch(e){if(e.name==='NS_ERROR_FILE_NOT_FOUND'){callback(new L10nError('Not found: '+url));}else{throw e;}}},load:function(url,callback,sync){return io._load('text/plain',url,callback,sync);},loadJSON:function(url,callback,sync){return io._load('application/json',url,callback,sync);}};function EventEmitter(){} +EventEmitter.prototype.emit=function ee_emit(){if(!this._listeners){return;} +var args=Array.prototype.slice.call(arguments);var type=args.shift();if(!this._listeners[type]){return;} +var typeListeners=this._listeners[type].slice();for(var i=0;i2){throw new L10nError('Error in ID: "'+name+'".'+' Nested attributes are not supported.');} +var attr;if(nameElements.length>1){name=nameElements[0];attr=nameElements[1];if(attr[0]==='$'){throw new L10nError('Attribute can\'t start with "$"',id);}}else{attr=null;} +this.setEntityValue(name,attr,key,this.unescapeString(value),ast);},setEntityValue:function(id,attr,key,rawValue,ast){var pos,v;var value=rawValue.indexOf('{{')>-1?this.parseString(rawValue):rawValue;if(attr){pos=this.entryIds[id];if(pos===undefined){v={$i:id};if(key){v[attr]={};v[attr][key]=value;}else{v[attr]=value;} +ast.push(v);this.entryIds[id]=ast.length-1;return;} +if(key){if(typeof(ast[pos][attr])==='string'){ast[pos][attr]={$x:this.parseIndex(ast[pos][attr]),$v:{}};} +ast[pos][attr].$v[key]=value;return;} +ast[pos][attr]=value;return;} +if(key){pos=this.entryIds[id];if(pos===undefined){v={};v[key]=value;ast.push({$i:id,$v:v});this.entryIds[id]=ast.length-1;return;} +if(typeof(ast[pos].$v)==='string'){ast[pos].$x=this.parseIndex(ast[pos].$v);ast[pos].$v={};} +ast[pos].$v[key]=value;return;} +ast.push({$i:id,$v:value});this.entryIds[id]=ast.length-1;},parseString:function(str){var chunks=str.split(this.patterns.placeables);var complexStr=[];var len=chunks.length;var placeablesCount=(len-1)/2;if(placeablesCount>=MAX_PLACEABLES){throw new L10nError('Too many placeables ('+placeablesCount+', max allowed is '+MAX_PLACEABLES+')');} +for(var i=0;i-1){return[{},env['__'+id]];} +if(args&&args.hasOwnProperty(id)){if(typeof args[id]==='string'||(typeof args[id]==='number'&&!isNaN(args[id]))){return[{},args[id]];}else{throw new L10nError('Arg must be a string or a number: '+id);}} +if(id in env&&id!=='__proto__'){return format(args,env[id]);} +throw new L10nError('Unknown reference: '+id);} +function subPlaceable(locals,args,env,id){var res;try{res=resolveIdentifier(args,env,id);}catch(err){return[{error:err},'{{ '+id+' }}'];} +var value=res[1];if(typeof value==='number'){return res;} +if(typeof value==='string'){if(value.length>=MAX_PLACEABLE_LENGTH){throw new L10nError('Too many characters in placeable ('+ +value.length+', max allowed is '+ +MAX_PLACEABLE_LENGTH+')');} +if(locals.contextIsNonLatin1||value.match(nonLatin1)){res[1]=FSI+value+PDI;} +return res;} +return[{},'{{ '+id+' }}'];} +function interpolate(locals,args,env,arr){return arr.reduce(function(prev,cur){if(typeof cur==='string'){return[prev[0],prev[1]+cur];}else if(cur.t==='idOrVar'){var placeable=subPlaceable(locals,args,env,cur.v);return[prev[0],prev[1]+placeable[1]];}},[locals,'']);} +function resolveSelector(args,env,expr,index){var selectorName=index[0].v;var selector=resolveIdentifier(args,env,selectorName)[1];if(typeof selector!=='function'){return selector;} +var argValue=index[1]?resolveIdentifier(args,env,index[1])[1]:undefined;if(selector===env.__plural){if(argValue===0&&'zero'in expr){return'zero';} +if(argValue===1&&'one'in expr){return'one';} +if(argValue===2&&'two'in expr){return'two';}} +return selector(argValue);} +function resolveValue(locals,args,env,expr,index){if(!expr){return[locals,expr];} +if(typeof expr==='string'||typeof expr==='boolean'||typeof expr==='number'){return[locals,expr];} +if(Array.isArray(expr)){locals.contextIsNonLatin1=expr.some(function($_){return typeof($_)==='string'&&$_.match(nonLatin1);});return interpolate(locals,args,env,expr);} +if(index){var selector=resolveSelector(args,env,expr,index);if(expr.hasOwnProperty(selector)){return resolveValue(locals,args,env,expr[selector]);}} +if('other'in expr){return resolveValue(locals,args,env,expr.other);} +throw new L10nError('Unresolvable value');} +var Resolver={createEntry:createEntry,format:format,rePlaceables:rePlaceables};function walkContent(node,fn){if(typeof node==='string'){return fn(node);} +if(node.t==='idOrVar'){return node;} +var rv=Array.isArray(node)?[]:{};var keys=Object.keys(node);for(var i=0,key;(key=keys[i]);i++){if(key==='$i'||key==='$x'){rv[key]=node[key];}else{rv[key]=walkContent(node[key],fn);}} +return rv;} +var reAlphas=/[a-zA-Z]/g;var reVowels=/[aeiouAEIOU]/g;var ACCENTED_MAP='\u0226\u0181\u0187\u1E12\u1E16\u0191\u0193\u0126\u012A'+'\u0134\u0136\u013F\u1E3E\u0220\u01FE\u01A4\u024A\u0158'+'\u015E\u0166\u016C\u1E7C\u1E86\u1E8A\u1E8E\u1E90'+'[\\]^_`'+'\u0227\u0180\u0188\u1E13\u1E17\u0192\u0260\u0127\u012B'+'\u0135\u0137\u0140\u1E3F\u019E\u01FF\u01A5\u024B\u0159'+'\u015F\u0167\u016D\u1E7D\u1E87\u1E8B\u1E8F\u1E91';var FLIPPED_MAP='\u2200\u0510\u2183p\u018E\u025F\u05E4HI\u017F'+'\u04FC\u02E5WNO\u0500\xD2\u1D1AS\u22A5\u2229\u0245'+'\uFF2DX\u028EZ'+'[\\]\u1D65_,'+'\u0250q\u0254p\u01DD\u025F\u0183\u0265\u0131\u027E'+'\u029E\u0285\u026Fuodb\u0279s\u0287n\u028C\u028Dx\u028Ez';function makeLonger(val){return val.replace(reVowels,function(match){return match+match.toLowerCase();});} +function replaceChars(map,val){return val.replace(reAlphas,function(match){return map.charAt(match.charCodeAt(0)-65);});} +var reWords=/[^\W0-9_]+/g;function makeRTL(val){return val.replace(reWords,function(match){return'\u202e'+match+'\u202c';});} +var reExcluded=/(%[EO]?\w|\{\s*.+?\s*\}|&[#\w]+;|<\s*.+?\s*>)/;function mapContent(fn,val){if(!val){return val;} +var parts=val.split(reExcluded);var modified=parts.map(function(part){if(reExcluded.test(part)){return part;} +return fn(part);});return modified.join('');} +function Pseudo(id,name,charMap,modFn){this.id=id;this.translate=mapContent.bind(null,function(val){return replaceChars(charMap,modFn(val));});this.name=this.translate(name);} +var PSEUDO={'fr-x-psaccent':new Pseudo('fr-x-psaccent','Runtime Accented',ACCENTED_MAP,makeLonger),'ar-x-psbidi':new Pseudo('ar-x-psbidi','Runtime Bidi',FLIPPED_MAP,makeRTL)};function Locale(id,ctx){this.id=id;this.ctx=ctx;this.isReady=false;this.entries=Object.create(null);this.entries.__plural=getPluralRule(this.isPseudo()?this.ctx.defaultLocale:id);} +Locale.prototype.isPseudo=function(){return this.ctx.qps.indexOf(this.id)!==-1;};var bindingsIO={extra:function(id,ver,path,type,callback,errback){if(type==='properties'){type='text';} +navigator.mozApps.getLocalizationResource(id,ver,path,type).then(callback.bind(null,null),errback);},app:function(id,ver,path,type,callback,errback,sync){switch(type){case'properties':io.load(path,callback,sync);break;case'json':io.loadJSON(path,callback,sync);break;}},};Locale.prototype.build=function L_build(callback){var sync=!callback;var ctx=this.ctx;var self=this;var l10nLoads=ctx.resLinks.length;function onL10nLoaded(err){if(err){ctx._emitter.emit('fetcherror',err);} +if(--l10nLoads<=0){self.isReady=true;if(callback){callback();}}} +if(l10nLoads===0){onL10nLoaded();return;} +function onJSONLoaded(err,json){if(!err&&json){self.addAST(json);} +onL10nLoaded(err);} +function onPropLoaded(err,source){if(!err&&source){var ast=PropertiesParser.parse(ctx,source);self.addAST(ast);} +onL10nLoaded(err);} +var idToFetch=this.isPseudo()?ctx.defaultLocale:this.id;var appVersion=null;var source='app';if(typeof(navigator)!=='undefined'){source=navigator.mozL10n._config.localeSources[this.id]||'app';appVersion=navigator.mozL10n._config.appVersion;} +for(var i=0;i=0)?'rtl':'ltr';} +var readyStates={loading:0,interactive:1,complete:2};function whenInteractive(callback){if(readyStates[document.readyState]>=readyStates.interactive){callback();return;} +document.addEventListener('readystatechange',function l10n_onrsc(){if(readyStates[document.readyState]>=readyStates.interactive){document.removeEventListener('readystatechange',l10n_onrsc);callback();}});} +function initObserver(){nodeObserver=new MutationObserver(onMutations.bind(navigator.mozL10n));nodeObserver.observe(document,moConfig);} +function init(pretranslate){if(!pretranslate){initObserver();} +initResources.call(navigator.mozL10n);} +function initResources(){var meta={};var nodes=document.head.querySelectorAll('link[rel="localization"],'+'meta[name="availableLanguages"],'+'meta[name="defaultLanguage"],'+'meta[name="appVersion"],'+'script[type="application/l10n"]');for(var i=0,node;node=nodes[i];i++){var type=node.getAttribute('rel')||node.nodeName.toLowerCase();switch(type){case'localization':this.ctx.resLinks.push(node.getAttribute('href'));break;case'meta':onMetaInjected.call(this,node,meta);break;case'script':onScriptInjected.call(this,node);break;}} +var additionalLanguagesPromise;if(navigator.mozApps&&navigator.mozApps.getAdditionalLanguages){additionalLanguagesPromise=navigator.mozApps.getAdditionalLanguages().catch(function(e){console.error('Error while loading getAdditionalLanguages',e);});document.addEventListener('additionallanguageschange',function(evt){registerLocales.call(this,meta,evt.detail);this.ctx.requestLocales.apply(this.ctx,navigator.languages||[navigator.language]);}.bind(this));}else{additionalLanguagesPromise=Promise.resolve();} +additionalLanguagesPromise.then(function(extraLangs){registerLocales.call(this,meta,extraLangs);initLocale.call(this);}.bind(this));} +function registerLocales(meta,extraLangs){var locales=buildLocaleList.call(this,meta,extraLangs);navigator.mozL10n._config.localeSources=locales[1];this.ctx.registerLocales(locales[0],Object.keys(locales[1]));} +function getMatchingLangpack(appVersion,langpacks){for(var i=0,langpack;(langpack=langpacks[i]);i++){if(langpack.target===appVersion){return langpack;}} +return null;} +function buildLocaleList(meta,extraLangs){var loc,lp;var localeSources=Object.create(null);var defaultLocale=meta.defaultLanguage||this.ctx.defaultLocale;if(meta.availableLanguages){for(loc in meta.availableLanguages){localeSources[loc]='app';}} +if(extraLangs){for(loc in extraLangs){lp=getMatchingLangpack(this._config.appVersion,extraLangs[loc]);if(!lp){continue;} +if(!(loc in localeSources)||!meta.availableLanguages[loc]||parseInt(lp.revision)>meta.availableLanguages[loc]){localeSources[loc]='extra';}}} +if(!(defaultLocale in localeSources)){localeSources[defaultLocale]='app';} +return[defaultLocale,localeSources];} +function splitAvailableLanguagesString(str){var langs={};str.split(',').forEach(function(lang){lang=lang.trim().split(':');langs[lang[0]]=parseInt(lang[1]);});return langs;} +function onMetaInjected(node,meta){switch(node.getAttribute('name')){case'availableLanguages':meta.availableLanguages=splitAvailableLanguagesString(node.getAttribute('content'));break;case'defaultLanguage':meta.defaultLanguage=node.getAttribute('content');break;case'appVersion':navigator.mozL10n._config.appVersion=node.getAttribute('content');break;}} +function onScriptInjected(node){var lang=node.getAttribute('lang');var locale=this.ctx.getLocale(lang);locale.addAST(JSON.parse(node.textContent));} +function initLocale(){this.ctx.requestLocales.apply(this.ctx,navigator.languages||[navigator.language]);window.addEventListener('languagechange',function l10n_langchange(){this.ctx.requestLocales.apply(this.ctx,navigator.languages||[navigator.language]);}.bind(this));} +function localizeMutations(mutations){var mutation;var targets=new Set();for(var i=0;i]/g;var htmlEntities={'&':'&','<':'<','>':'>',};function translateDocument(){document.documentElement.lang=this.language.code;document.documentElement.dir=this.language.direction;translateFragment.call(this,document.documentElement);} +function translateFragment(element){if(typeof element.hasAttribute==='function'&&element.hasAttribute('data-l10n-id')){translateElement.call(this,element);} +var nodes=getTranslatableChildren(element);for(var i=0;ithis.childViews[name].beforeShow(options)));};BaseView.prototype.show=function(){return Promise.all(Object.keys(this.childViews).map(name=>this.childViews[name].show()));};BaseView.prototype.beforeHide=function(){return Promise.all(Object.keys(this.childViews).map(name=>this.childViews[name].beforeHide()));};BaseView.prototype.hide=function(){return Promise.all(Object.keys(this.childViews).map(name=>this.childViews[name].hide()));};exports.BaseView=BaseView;})(window);;'use strict';(function(exports){var UserDictionary=function UserDictionary(){this._wordSet=null;this._saveQueue=null;this._dbStore=null;this._started=false;};UserDictionary.prototype.start=function(){if(this._started){console.error('UserDictionary: attempting to start twice');return;} +this._started=true;this._saveQueue=Promise.resolve();this._dbStore=new PromiseStorage(this.DB_NAME);this._dbStore.start();};UserDictionary.prototype.stop=function(){if(this._started){this._wordSet=null;this._saveQueue=null;this._dbStore.stop();}};UserDictionary.prototype.DB_NAME='UserDictLatin';UserDictionary.prototype.getList=function(){if(!this._started){return Promise.reject('UserDictionary not started');} +return this._dbStore.getItem('wordlist').then(list=>{list=list||[];this._wordSet=new Set(list);return this._wordSet;}).catch(e=>{e&&console.error(e);this._wordSet=new Set([]);return this._wordSet;});};UserDictionary.prototype._saveDict=function(){var wordList=Array.from(this._wordSet);wordList=wordList.sort((a,b)=>a.toLocaleLowerCase().localeCompare(b.toLocaleLowerCase()));this._wordSet=new Set(wordList);var dictBlob=0===wordList.length?undefined:new WordListConverter(wordList).toBlob();var p=this._saveQueue.then(()=>{this._dbStore.setItems({'wordlist':wordList,'dictblob':dictBlob});return wordList;});this._saveQueue=p;this._saveQueue=this._saveQueue.catch(e=>{console.error(e);});return p;};UserDictionary.prototype.addWord=function(word){if(!this._started){return Promise.reject('UserDictionary not started');} +word=word.trim();if(this._wordSet.has(word)){return Promise.reject('existing');} +this._wordSet.add(word);return this._saveDict();};UserDictionary.prototype.updateWord=function(oldWord,word){if(!this._started){return Promise.reject('UserDictionary not started');} +word=word.trim();if(oldWord===word){return Promise.resolve(Array.from(this._wordSet));} +this._wordSet.delete(oldWord);if(this._wordSet.has(word)){return this._saveDict().then(()=>Promise.reject('existing'));}else{this._wordSet.add(word);return this._saveDict();}};UserDictionary.prototype.removeWord=function(word){if(!this._started){return Promise.reject('UserDictionary not started');} +this._wordSet.delete(word);return this._saveDict();};UserDictionary.prototype._getBlob=function(){return this._dbStore.getItem('dictblob');};exports.UserDictionary=UserDictionary;})(window);;'use strict';(function(){var namespace;try{namespace=window;}catch(e){namespace=module.exports;} +(function(exports){const _EndOfWord=String.fromCharCode(0);const _DEBUG=true;var TSTNode=function(ch){this.ch=ch;this.left=this.center=this.right=null;this.frequency=0;this.count=0;};var TSTTree=function(ch){this.table={};};TSTTree.prototype.insert=function(node,word,freq){var ch=word[0];if(!node){node=new TSTNode(ch);} +if(chnode.ch){node.right=this.insert(node.right,word,freq);}else{node.frequency=Math.max(node.frequency,freq);if(word.length>1){node.center=this.insert(node.center,word.substring(1),freq);}} +return node;};TSTTree.prototype.setCount=function(node){if(!node){return 0;} +node.count=this.setCount(node.left)+this.setCount(node.right)+1;this.setCount(node.center);return node.count;};TSTTree.prototype.rotateRight=function(node){var tmp=node.left;node.left=tmp.right;tmp.right=node;node.count=(node.left?node.left.count:0)+ +(node.right?node.right.count:0)+1;tmp.count=(tmp.left?tmp.left.count:0)+tmp.right.count+1;return tmp;};TSTTree.prototype.rotateLeft=function(node){var tmp=node.right;node.right=tmp.left;tmp.left=node;node.count=(node.left?node.left.count:0)+ +(node.right?node.right.count:0)+1;tmp.count=tmp.left.count+(tmp.right?tmp.right.count:0)+1;return tmp;};TSTTree.prototype.divide=function(node,divCount){var leftCount=node.left?node.left.count:0;if(divCountleftCount){node.right=this.divide(node.right,divCount-leftCount-1);node=this.rotateLeft(node);} +return node;};TSTTree.prototype.balanceLevel=function(node){if(!node){return node;} +node=this.divide(node,Math.floor(node.count/2));node.left=this.balanceLevel(node.left);node.right=this.balanceLevel(node.right);node.center=this.balanceTree(node.center);return node;};TSTTree.prototype.collectLevel=function(level,node){if(!node){return;} +level.push(node);this.collectLevel(level,node.left);this.collectLevel(level,node.right);};TSTTree.prototype.sortLevelByFreq=function(node){var nodes=[];this.collectLevel(nodes,node);nodes.sort(function(node1,node2){return node1.ch.charCodeAt(0)-node2.ch.charCodeAt(0);});nodes.sort(function(node1,node2){return node2.frequency-node1.frequency;});var prev=null;nodes.forEach(function(node,index){node.next=(indexroot.ch){root.right=this.promoteNodeToRoot(root.right,node);return this.rotateLeft(root);}else{return root;}};TSTTree.prototype.balanceTree=function(node){if(!node){return;} +node=this.promoteNodeToRoot(node,this.sortLevelByFreq(node));node.left=this.balanceLevel(node.left);node.right=this.balanceLevel(node.right);node.center=this.balanceTree(node.center);return node;};TSTTree.prototype.balance=function(root){this.setCount(root);root=this.balanceTree(root);return root;};var TSTBuilder=function(words){this.words=words;this._built=false;this.maxWordLength=0;this.characterFrequency={};this.tstRoot=null;};TSTBuilder.prototype.debug=function(msg){if(_DEBUG){console.log(msg);}};TSTBuilder.prototype.build=function(){var tstRoot=null;var tree=new TSTTree();this.words.forEach(function(wordFreq){var word=wordFreq.w;var freq=wordFreq.f;this.maxWordLength=Math.max(this.maxWordLength,word.length);tstRoot=tree.insert(tstRoot,word+_EndOfWord,freq);word.split('').forEach(function(ch){if(ch in this.characterFrequency){this.characterFrequency[ch]++;}else{this.characterFrequency[ch]=1;}},this);},this);tstRoot=tree.balance(tstRoot);this.tstRoot=tstRoot;this._built=true;};TSTBuilder.prototype.getTreeRoot=function(){if(!this._built){throw Error('TST not built yet.');} +return this.tstRoot;};TSTBuilder.prototype.getMaxWordLength=function(){if(!this._built){throw Error('TST not built yet.');} +return this.maxWordLength;};TSTBuilder.prototype.getCharacterFrequency=function(){if(!this._built){throw Error('TST not built yet.');} +return this.characterFrequency;};var TSTSerializer=function(tstRoot){this._tstRoot=tstRoot;this._output=null;};TSTSerializer.prototype.debug=function(msg){if(_DEBUG){console.log(msg);}};TSTSerializer.prototype._serializeNode=function(node){this._output.push(node);if(node.ch==_EndOfWord&&node.center){this.debug('nul node with a center!');} +if(node.ch!=_EndOfWord&&!node.center){this.debug('char node with no center!');} +if(node.center){this._serializeNode(node.center);} +if(node.left){this._serializeNode(node.left);} +if(node.right){this._serializeNode(node.right);}};TSTSerializer.prototype.serializeToNodes=function(){this._output=[];this._serializeNode(this._tstRoot);return this._output;};var TSTBlobBuilder=function(nodes,characterFrequency,maxWordLength){this._nodes=nodes;this._characterFrequency=characterFrequency;this._maxWordLength=maxWordLength;this._output=null;this._outputPos=undefined;};TSTBlobBuilder.prototype.debug=function(msg){if(_DEBUG){console.log(msg);}};TSTBlobBuilder.prototype.toBlobArray=function(){var nodeslen=this._computeOffsets();this._output=new Uint8Array(15+(6*Object.keys(this._characterFrequency).length)+ +nodeslen);this._outputPos=0;this._output[this._outputPos++]='F'.charCodeAt(0);this._output[this._outputPos++]='x'.charCodeAt(0);this._output[this._outputPos++]='O'.charCodeAt(0);this._output[this._outputPos++]='S'.charCodeAt(0);this._output[this._outputPos++]='D'.charCodeAt(0);this._output[this._outputPos++]='I'.charCodeAt(0);this._output[this._outputPos++]='C'.charCodeAt(0);this._output[this._outputPos++]='T'.charCodeAt(0);this._output[this._outputPos++]=0;this._output[this._outputPos++]=0;this._output[this._outputPos++]=0;this._output[this._outputPos++]=1;this._output[this._outputPos++]=Math.min(this._maxWordLength,255);var characters=Object.keys(this._characterFrequency).map(function(ch){return{ch:ch,freq:this._characterFrequency[ch]};},this);characters.sort(function(chFreq1,chFreq2){return chFreq2.freq-chFreq1.freq;});this._output[this._outputPos++]=(characters.length>>8)&0xFF;this._output[this._outputPos++]=characters.length&0xFF;characters.forEach(function(chFreq){var charCode=chFreq.ch.charCodeAt(0);this._output[this._outputPos++]=(charCode>>8)&0xFF;this._output[this._outputPos++]=charCode&0xFF;var freq=chFreq.freq;this._output[this._outputPos++]=(freq>>24)&0xFF;this._output[this._outputPos++]=(freq>>16)&0xFF;this._output[this._outputPos++]=(freq>>8)&0xFF;this._output[this._outputPos++]=freq&0xFF;},this);this._nodes.forEach(function(node){this._emitNode(node);},this);return this._output.buffer;};TSTBlobBuilder.prototype._computeOffsets=function(){var offset=0;this._nodes.forEach(function(node){node.offset=offset;var charlen;if(node.ch==_EndOfWord){charlen=0;}else if(node.ch.charCodeAt(0)<=255){charlen=1;}else{charlen=2;} +var nextlen=node.next?3:0;offset=offset+1+charlen+nextlen;});return offset;};TSTBlobBuilder.prototype._writeUint24=function(x){this._output[this._outputPos++]=(x>>16)&0xFF;this._output[this._outputPos++]=(x>>8)&0xFF;this._output[this._outputPos++]=x&0xFF;};TSTBlobBuilder.prototype._emitNode=function(node){var charcode=(node.ch==_EndOfWord)?0:node.ch.charCodeAt(0);var cbit=(0!==charcode)?0x80:0;var sbit=(charcode>255)?0x40:0;var nbit=node.next?0x20:0;var freq;if(0===node.frequency){freq=0;}else{freq=1+Math.floor(node.frequency*31);} +var firstbyte=cbit|sbit|nbit|(freq&0x1F);this._output[this._outputPos++]=firstbyte;if(cbit){if(sbit){this._output[this._outputPos++]=charcode>>8;} +this._output[this._outputPos++]=charcode&0xFF;} +if(nbit){this._writeUint24(node.next.offset);}};var WordListConverter=function(words){this.blob=undefined;words.reduce(function(prevType,word){var thisType=typeof word;if(thisType!==prevType){throw'Type mismatch. previous: '+prevType+', this: '+thisType;} +if('object'===thisType){if(!('w'in word)){throw'"w" field not found in word';} +if(!('f'in word)){throw'"f" field not found in word';} +if(!(word.f>=0&&word.f<1)){throw'"f" value not in allowed range';}} +return thisType;},typeof words[0]);this.words=words;};WordListConverter.prototype.debug=function(msg){if(_DEBUG){console.log(msg);}};WordListConverter.prototype.toBlob=function(){if(this.blob){return this.blob;} +var words=this.words;if('string'===typeof words[0]){words=words.map(function(word){return{w:word,f:0.3};});} +var tstBuilder=new TSTBuilder(words);tstBuilder.build();var nodes=new TSTSerializer(tstBuilder.getTreeRoot()).serializeToNodes();this.blob=new TSTBlobBuilder(nodes,tstBuilder.getCharacterFrequency(),tstBuilder.getMaxWordLength()).toBlobArray();return this.blob;};exports.WordListConverter=WordListConverter;})(namespace);})();;'use strict';(function(exports){var UserDictionaryListPanel=function(app){BaseView.apply(this);this.app=app;this._model=new UserDictionary(this);this._populated=false;this._listContainer=null;this._domWordMap=null;this._wordDomMap=null;};UserDictionaryListPanel.prototype=Object.create(BaseView.prototype);UserDictionaryListPanel.prototype.CONTAINER_ID='panel-ud-wordlist';UserDictionaryListPanel.prototype.start=function(){BaseView.prototype.start.call(this);this._listContainer=this.container.querySelector('#ud-wordlist-list');this._model.start();this._domWordMap=new WeakMap();this._wordDomMap={};};UserDictionaryListPanel.prototype.stop=function(){BaseView.prototype.stop.call(this);this._populated=false;this._listContainer=null;this._model.stop();this._domWordMap=null;this._wordDomMap=null;};UserDictionaryListPanel.prototype.beforeShow=function(options){if(!this._populated){this._populated=true;return this._model.getList().then(words=>{if(!words||words.size===0){this.container.classList.add('empty');}else{this.container.classList.remove('empty');this._rearrangeList(words);}}).catch(e=>console.error(e));}};UserDictionaryListPanel.prototype.show=function(){this.container.querySelector('#ud-addword-btn').addEventListener('click',this);this._listContainer.addEventListener('click',this);this.container.querySelector('gaia-header').addEventListener('action',this);};UserDictionaryListPanel.prototype.beforeHide=function(){this.container.querySelector('#ud-addword-btn').removeEventListener('click',this);this._listContainer.removeEventListener('click',this);this.container.querySelector('gaia-header').removeEventListener('action',this);};UserDictionaryListPanel.prototype.handleEvent=function(evt){var target=evt.target;switch(evt.type){case'click':if('ud-addword-btn'===target.id){this._showAddDialog();}else if('li'===target.tagName.toLowerCase()){this._showEditDialog(target);evt.preventDefault();} +break;case'action':this.app.panelController.navigateToRoot();break;}};UserDictionaryListPanel.prototype._rearrangeList=function(wordList){wordList.forEach(word=>{word=word.trim();var wordElem;if(word in this._wordDomMap){wordElem=this._wordDomMap[word];}else{wordElem=this._createWordElem(word);} +this._listContainer.appendChild(wordElem);});};UserDictionaryListPanel.prototype._createWordElem=function(word){var innerAnchor=document.createElement('a');innerAnchor.href='#'+word;innerAnchor.textContent=word;var elem=document.createElement('li');elem.appendChild(innerAnchor);this._domWordMap.set(elem,word);this._wordDomMap[word]=elem;return elem;};UserDictionaryListPanel.prototype._showAddDialog=function(){this.app.dialogController.openDialog(this.app.dialogController.userDictionaryEditDialog).then(result=>{if('commit'===result.action){this._addWord(result.word);}}).catch(e=>e&&console.error(e));};UserDictionaryListPanel.prototype._showEditDialog=function(wordElem){var word=this._domWordMap.get(wordElem);this.app.dialogController.openDialog(this.app.dialogController.userDictionaryEditDialog,{word:word}).then(result=>{switch(result.action){case'remove':this._removeWord(word,wordElem);break;case'commit':this._replaceWord(word,result.word,wordElem);break;}}).catch(e=>e&&console.error(e));};UserDictionaryListPanel.prototype._addWord=function(word){word=word.trim();if(word.length>0){var awakeLock=this.app.closeLockManager.requestLock('stayAwake');this._model.addWord(word).then(wordList=>{awakeLock.unlock();this.container.classList.remove('empty');this._rearrangeList(wordList);}).catch(e=>{awakeLock.unlock();if('existing'===e){return;}else{console.error(e);}});}};UserDictionaryListPanel.prototype._removeWord=function(word,wordElem){var awakeLock=this.app.closeLockManager.requestLock('stayAwake');this._model.removeWord(word).then(()=>{awakeLock.unlock();this._domWordMap.delete(wordElem);delete this._wordDomMap[word];this._listContainer.removeChild(wordElem);if(0===this._listContainer.childNodes.length){this.container.classList.add('empty');}}).catch(e=>{awakeLock.unlock();console.error(e);});};UserDictionaryListPanel.prototype._replaceWord=function(oldWord,newWord,wordElem){newWord=newWord.trim();if(newWord.length>0&&oldWord!==newWord){var awakeLock=this.app.closeLockManager.requestLock('stayAwake');this._model.updateWord(oldWord,newWord).then(wordList=>{awakeLock.unlock();this._domWordMap.set(wordElem,newWord);delete this._wordDomMap[oldWord];this._wordDomMap[newWord]=wordElem;wordElem.childNodes[0].textContent=newWord;this._rearrangeList(wordList);}).catch(e=>{awakeLock.unlock();if('existing'===e){this._domWordMap.delete(wordElem);delete this._wordDomMap[oldWord];this._listContainer.removeChild(wordElem);}else{console.error(e);}});}};exports.UserDictionaryListPanel=UserDictionaryListPanel;})(window);;'use strict';(function(exports){var UserDictionaryEditDialog=function(){BaseView.apply(this);this._inputField=null;this._oldWord=undefined;};UserDictionaryEditDialog.prototype=Object.create(BaseView.prototype);UserDictionaryEditDialog.prototype.CONTAINER_ID='panel-ud-editword';UserDictionaryEditDialog.prototype.onsubmit=undefined;UserDictionaryEditDialog.prototype.start=function(){BaseView.prototype.start.call(this);this._inputField=this.container.querySelector('#ud-editword-input');};UserDictionaryEditDialog.prototype.stop=function(){BaseView.prototype.stop.call(this);this._inputField=null;};UserDictionaryEditDialog.prototype.beforeShow=function(options){if(options&&'word'in options){this.container.classList.remove('add-mode');this._inputField.value=options.word;this._oldWord=options.word;}else{this.container.classList.add('add-mode');}};UserDictionaryEditDialog.prototype.show=function(){this.container.querySelector('#ud-editword-header').addEventListener('action',this);this.container.querySelector('#ud-saveword-btn').addEventListener('click',this);this.container.querySelector('#ud-editword-input').addEventListener('keydown',this);this.container.querySelector('#ud-editword-delete-btn').addEventListener('click',this);this.container.querySelector('#ud-editword-dialog-cancel-btn').addEventListener('click',this);this.container.querySelector('#ud-editword-dialog-delete-btn').addEventListener('click',this);this._inputField.focus();};UserDictionaryEditDialog.prototype.beforeHide=function(){this.container.querySelector('#ud-editword-header').removeEventListener('action',this);this.container.querySelector('#ud-saveword-btn').removeEventListener('click',this);this.container.querySelector('#ud-editword-input').removeEventListener('keydown',this);this.container.querySelector('#ud-editword-delete-btn').removeEventListener('click',this);this.container.querySelector('#ud-editword-dialog-cancel-btn').removeEventListener('click',this);this.container.querySelector('#ud-editword-dialog-delete-btn').removeEventListener('click',this);};UserDictionaryEditDialog.prototype.hide=function(){this._inputField.value='';this._oldWord=undefined;};UserDictionaryEditDialog.prototype.handleEvent=function(evt){switch(evt.type){case'action':this._cancel();break;case'click':switch(evt.target.id){case'ud-saveword-btn':this._commitWord();break;case'ud-editword-delete-btn':navigator.mozL10n.setAttributes(this.container.querySelector('#ud-editword-delete-prompt'),'userDictionaryDeletePrompt',{word:this._oldWord});this.container.querySelector('#ud-editword-delete-dialog').removeAttribute('hidden');break;case'ud-editword-dialog-delete-btn':this._removeWord();case'ud-editword-dialog-cancel-btn':this.container.querySelector('#ud-editword-delete-dialog').setAttribute('hidden',true);break;} +break;case'keydown':if(evt.keyCode===KeyEvent.DOM_VK_RETURN){this._commitWord();this._inputField.blur();} +break;}};UserDictionaryEditDialog.prototype._removeWord=function(){this.onsubmit({action:'remove'});};UserDictionaryEditDialog.prototype._commitWord=function(){this.onsubmit({action:'commit',word:this._inputField.value.trim()});};UserDictionaryEditDialog.prototype._cancel=function(){this.onsubmit({action:'cancel'});};exports.UserDictionaryEditDialog=UserDictionaryEditDialog;})(window);;'use strict';(function(exports){var SettingsView=function(app,container,settingsConstructor){BaseView.apply(this);this.app=app;this.container=container;this.SettingsConstructor=settingsConstructor;this.settings=null;this.elements=[];this.taskQueue=null;};SettingsView.prototype=Object.create(BaseView.prototype);SettingsView.prototype.start=function(){this.settings=new this.SettingsConstructor();this.settings.promiseManager=this.app.settingsPromiseManager;this.settings.onsettingchange=function(){this.taskQueue=this.taskQueue.then(this._updateUI.bind(this)).catch(function(e){console.error(e);});}.bind(this);this.taskQueue=this.settings.initSettings().then(this._updateUI.bind(this)).catch(function(e){console.error(e);});this.settings.KEYS.forEach(function(settingKey,i){var el=this.container.querySelector('[data-setting="'+settingKey+'"]');if(!el){return;} +this.elements[i]=el;el.addEventListener('change',this);},this);};SettingsView.prototype._updateUI=function(){var values=this.settings.getSettingsSync();this.settings.KEYS.forEach(function(settingKey,i){var el=this.elements[i];if(!el){return;} +el.disabled=false;switch(el.type||el.nodeName.toLowerCase()){case'gaia-checkbox':el.checked=values[this.settings.PROPERTIES[i]];break;case'range':el.value=values[this.settings.PROPERTIES[i]];break;default:throw'SettingsView: UI type unimplemented.';}},this);};SettingsView.prototype.handleEvent=function(evt){var el=evt.target;var settingsKey=el.dataset.setting;var lock;var value;switch(el.type||el.nodeName.toLowerCase()){case'gaia-checkbox':lock=this.app.closeLockManager.requestLock('stayAwake');value=el.checked;break;case'range':lock=this.app.closeLockManager.requestLock('stayAwake');value=el.valueAsNumber;break;default:throw'SettingsView: UI type unimplemented.';} +el.disabled=true;this.taskQueue=this.taskQueue.then(function(){return this.app.settingsPromiseManager.set(settingsKey,value);}.bind(this)).then(function(){el.disabled=false;lock.unlock();},function(e){console.error('SettingsView: Attempt to set setting failed',settingsKey,e);el.disabled=false;this._updateUI();lock.unlock();}.bind(this)).catch(function(e){console.error(e);});};SettingsView.prototype.stop=function(){this.elements.forEach(function(el){if(!el){return;} +el.removeEventListener('change',this);});this.settings=null;this.elements=[];this.taskQueue=null;};exports.SettingsView=SettingsView;})(window);;'use strict';(function(exports){var GeneralSettingsGroupView=function GeneralSettingsGroupView(app){BaseView.apply(this);this.app=app;};GeneralSettingsGroupView.prototype=Object.create(BaseView.prototype);GeneralSettingsGroupView.prototype.CONTAINER_ID='general-settings';GeneralSettingsGroupView.prototype.start=function(){BaseView.prototype.start.call(this);this.childViews.soundFeedbackSettings=new SettingsView(this.app,this.container,SoundFeedbackSettings);this.childViews.soundFeedbackSettings.start();this.childViews.vibrationFeedbackSettings=new SettingsView(this.app,this.container,VibrationFeedbackSettings);this.childViews.vibrationFeedbackSettings.start();this.childViews.imEngineSettings=new SettingsView(this.app,this.container,IMEngineSettings);this.childViews.imEngineSettings.start();};GeneralSettingsGroupView.prototype.stop=function(){BaseView.prototype.stop.call(this);this.childViews.soundFeedbackSettings.stop();delete this.childViews.soundFeedbackSettings;this.childViews.vibrationFeedbackSettings.stop();delete this.childViews.vibrationFeedbackSettings;this.childViews.imEngineSettings.stop();delete this.childViews.imEngineSettings;};exports.GeneralSettingsGroupView=GeneralSettingsGroupView;})(window);;'use strict';(function(exports){var GeneralPanel=function(app){BaseView.apply(this);this._menuUDItem=null;this.app=app;};GeneralPanel.prototype=Object.create(BaseView.prototype);GeneralPanel.prototype.CONTAINER_ID='general';GeneralPanel.prototype.USER_DICT_ITEM_ID='menu-userdict';GeneralPanel.prototype.start=function(){BaseView.prototype.start.call(this);this._menuUDItem=document.getElementById(this.USER_DICT_ITEM_ID);this.childViews.general=new GeneralSettingsGroupView(this.app);this.childViews.general.start();if(typeof HandwritingSettingsGroupView==='function'){this.childViews.handwriting=new HandwritingSettingsGroupView(this.app);this.childViews.handwriting.start();}else{this.childViews.handwriting=new BaseView();this.childViews.handwriting.start();} +this.childViews.layoutItemList=new LayoutItemListView(this.app);this.childViews.layoutItemList.start();};GeneralPanel.prototype.stop=function(){BaseView.prototype.stop.call(this);this._menuUDItem=null;this.childViews.general.stop();delete this.childViews.general;this.childViews.handwriting.stop();delete this.childViews.handwriting;this.childViews.layoutItemList.stop();delete this.childViews.layoutItemList;};GeneralPanel.prototype.show=function(){this.container.querySelector('gaia-header').addEventListener('action',this);if(this._menuUDItem){this._menuUDItem.addEventListener('click',this);} +return BaseView.prototype.show.call(this);};GeneralPanel.prototype.beforeHide=function(){this.container.querySelector('gaia-header').removeEventListener('action',this);if(this._menuUDItem){this._menuUDItem.removeEventListener('click',this);} +return BaseView.prototype.beforeHide.call(this);};GeneralPanel.prototype.handleEvent=function(evt){switch(evt.type){case'action':this.app.requestClose();break;case'click':this.app.panelController.navigateToPanel(this.app.panelController.userDictionaryListPanel);evt.preventDefault();break;}};exports.GeneralPanel=GeneralPanel;})(window);;'use strict';(function(exports){const TRANSITION_TIMEOUT=600;var PanelController=function(app,rootPanelClass){this.RootPanelClass=rootPanelClass||this.ROOT_PANEL_CLASS;this._currentPanel=null;this.app=app;this.rootPanel=null;this.userDictionaryListPanel=null;};PanelController.prototype.ROOT_PANEL_CLASS=GeneralPanel;PanelController.prototype.start=function(){this.rootPanel=new this.RootPanelClass(this.app);this.rootPanel.start();if(typeof UserDictionaryListPanel==='function'){this.userDictionaryListPanel=new UserDictionaryListPanel(this.app);this.userDictionaryListPanel.start();} +Promise.resolve(this.rootPanel.beforeShow()).then(this.rootPanel.show.bind(this.rootPanel)).catch(e=>e&&console.error(e));};PanelController.prototype.stop=function(){this._currentPanel=null;this.rootPanel.stop();this.rootPanel=null;if(this.userDictionaryListPanel){this.userDictionaryListPanel.stop();this.userDictionaryListPanel=null;}};PanelController.prototype._createTransitionPromise=function(target){return new Promise(function(resolve){var transitionEnd=function(){clearTimeout(timeout);target.removeEventListener('transitionend',transitionEnd);resolve();};var timeout=setTimeout(transitionEnd,TRANSITION_TIMEOUT);target.addEventListener('transitionend',transitionEnd);});};PanelController.prototype.navigateToRoot=function(){Promise.resolve(this._currentPanel.beforeHide()).then(()=>this.rootPanel.beforeShow()).then(()=>{var transitionPromise=this._createTransitionPromise(this._currentPanel.container);this._currentPanel.container.classList.remove('current');this.rootPanel.container.classList.remove('prev');this.rootPanel.container.classList.add('current');return transitionPromise;}).then(this._currentPanel.hide.bind(this._currentPanel)).then(this.rootPanel.show.bind(this.rootPanel)).then(()=>{this._currentPanel=null;}).catch(e=>e&&console.error(e));};PanelController.prototype.navigateToPanel=function(panel,options){this._currentPanel=panel;Promise.resolve(this.rootPanel.beforeHide()).then(()=>panel.beforeShow(options)).then(()=>{var transitionPromise=this._createTransitionPromise(panel.container);panel.container.classList.add('current');this.rootPanel.container.classList.remove('current');this.rootPanel.container.classList.add('prev');return transitionPromise;}).then(this.rootPanel.hide.bind(this.rootPanel)).then(panel.show.bind(panel)).catch(e=>e&&console.error(e));};var DialogController=function(){this.userDictionaryEditDialog=null;};DialogController.prototype.start=function(){if(typeof UserDictionaryEditDialog==='function'){this.userDictionaryEditDialog=new UserDictionaryEditDialog(this);this.userDictionaryEditDialog.start();}};DialogController.prototype.stop=function(){if(this.userDictionaryEditDialog){this.userDictionaryEditDialog.stop();this.userDictionaryEditDialog=null;}};DialogController.prototype._createTransitionPromise=PanelController.prototype._createTransitionPromise;DialogController.prototype.openDialog=function(dialog,options){if(!('onsubmit'in dialog)){return Promise.reject('Dialog does not have a onsubmit callback');} +var resultPromiseResolve,resultPromiseReject;var resultPromise=new Promise(function(resolve,reject){resultPromiseResolve=resolve;resultPromiseReject=reject;});dialog.onsubmit=results=>{resultPromiseResolve(results);Promise.resolve(dialog.beforeHide()).then(()=>{var transitionPromise=this._createTransitionPromise(dialog.container);dialog.container.classList.remove('displayed');return transitionPromise;}).then(()=>{dialog.onsubmit=undefined;return dialog.hide();}).catch(e=>e&&console.log(e));};Promise.resolve(dialog.beforeShow(options)).then(()=>{var transitionPromise=this._createTransitionPromise(dialog.container);dialog.container.classList.add('displayed');return transitionPromise;}).then(dialog.show.bind(dialog)).catch(e=>resultPromiseReject(e));return resultPromise;};exports.PanelController=PanelController;exports.DialogController=DialogController;})(window);;'use strict';'use strict'; + +(function(exports) { + +var LayoutDictionaryDownloader = function(imEngineId, dictFilename) { + this.imEngineId = imEngineId; + this.dictFilename = dictFilename; + + this._xhr = null; +}; + +// Dictionaries ship with Vulpes so adding a layout also works offline. +LayoutDictionaryDownloader.prototype.REMOTE_URL = + '/js/imes/%imEngineId/dictionaries/%dictFilename'; + +// If the data schema changes in an incompatible way, we must bump the +// version-to-download here. +LayoutDictionaryDownloader.prototype.ENGINE_DATA_VERSIONS = Object.freeze({ + 'latin': 1 +}); + +LayoutDictionaryDownloader.prototype.onprogress = null; + +LayoutDictionaryDownloader.prototype.load = function() { + if (this._xhr) { + throw new Error('LayoutDictionaryDownloader: Already downloading...'); + } + + var p = new Promise(function(resolve, reject) { + var url = this.REMOTE_URL + .replace('%imEngineId', this.imEngineId) + .replace('%ver', this.ENGINE_DATA_VERSIONS[this.imEngineId]) + .replace('%dictFilename', this.dictFilename); + + var xhr = this._xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + + xhr.onprogress = function(evt) { + if (typeof this.onprogress === 'function') { + this.onprogress(evt.loaded, evt.total); + } + }.bind(this); + + xhr.onloadend = function() { + this._xhr = null; + + var data = xhr.response; + // We will only resolve the promise when the data is verified. + // For any other situration, we simply return the HTTP status code as + // a rejected placeholder value. + // (it doesn't really matter if you got 200/404/500 + // or anything if it's not what you are looking for right :-/?) + if (data && this._verifyData(data)) { + if (typeof this.onprogress === 'function') { + this.onprogress(data.byteLength, data.byteLength); + } + + resolve(data); + } else { + reject(xhr.statusText); + } + }.bind(this); + + xhr.send(); + }.bind(this)); + + return p; +}; + +LayoutDictionaryDownloader.prototype.abort = function() { + if (!this._xhr) { + throw new Error('LayoutDictionaryDownloader: ' + + 'Not downloading but abort is called.'); + } + + this._xhr.abort(); + + this._xhr = null; +}; + +LayoutDictionaryDownloader.prototype._verifyData = function(buffer) { + switch (this.imEngineId) { + case 'latin': + // There is only first 8 bytes to check -- we can't be sure if the data + // is truncated. However that shouldn't happen since our CDN sends out + // Content-Length header. + // + // TODO: Harden the verification here in some way. + // + if (!(buffer instanceof ArrayBuffer) || buffer.byteLength < 8) { + return false; + } + var view = new Uint8Array(buffer, 0, 8); + return (String.fromCharCode.apply(String, view) === 'FxOSDICT'); + + default: + throw new Error('LayoutDictionaryDownloader: ' + + 'No verify method available for this imEngine.'); + } +}; + +exports.LayoutDictionaryDownloader = LayoutDictionaryDownloader; + +}(window)); + +;'use strict';(function(exports){var Deferred=function(){this.promise=new Promise(function(resolve,reject){this.resolve=resolve;this.reject=reject;}.bind(this));return this;};var LayoutDictionary=function(list,dict){this.dbStore=list.dbStore;this.imEngineId=dict.imEngineId;this.filename=dict.filename;this.filePath=dict.filePath;this.fileSize=dict.fileSize;this.databaseId=dict.databaseId;this.installedLayoutIds=dict.installedLayoutIds;if(dict.preloaded){this.state=this.STATE_PRELOADED;}else if(this.installedLayoutIds.size!==0){this.state=this.STATE_INSTALLED;}else{this.state=this.STATE_INSTALLABLE;} +this._downloader=null;this._installingLayoutDeferreds=null;this._installingPromise=null;this._removingPromise=null;};LayoutDictionary.prototype.state=0;LayoutDictionary.prototype.imEngineId='';LayoutDictionary.prototype.filename='';LayoutDictionary.prototype.filePath='';LayoutDictionary.prototype.fileSize=0;LayoutDictionary.prototype.databaseId=0;LayoutDictionary.prototype.installedLayoutIds=null;LayoutDictionary.prototype.downloadLoadedSize=0;LayoutDictionary.prototype.downloadTotalSize=0;LayoutDictionary.prototype.STATE_PRELOADED=1;LayoutDictionary.prototype.STATE_INSTALLABLE=2;LayoutDictionary.prototype.STATE_INSTALLING_CANCELLABLE=3;LayoutDictionary.prototype.STATE_INSTALLING=4;LayoutDictionary.prototype.STATE_INSTALLED=5;LayoutDictionary.prototype.STATE_REMOVING=6;LayoutDictionary.prototype.start=function(){this._installingLayoutDeferreds=new Map();};LayoutDictionary.prototype.stop=function(){this._downloader=null;this._installingLayoutDeferreds=null;this._installingPromise=null;this._removingPromise=null;};LayoutDictionary.prototype.installForLayout=function(layoutItem){var deferred;switch(this.state){case this.STATE_PRELOADED:throw new Error('LayoutDictionary: '+'Can\'t install a dictionary under this state.');case this.STATE_INSTALLABLE:this._startInstall();deferred=new Deferred();this._installingLayoutDeferreds.set(layoutItem,deferred);return deferred.promise;case this.STATE_INSTALLING_CANCELLABLE:case this.STATE_INSTALLING:if(this._installingLayoutDeferreds.has(layoutItem)){return this._installingLayoutDeferreds.get(layoutItem).promise;} +deferred=new Deferred();this._installingLayoutDeferreds.set(layoutItem,deferred);return deferred.promise;case this.STATE_INSTALLED:this.installedLayoutIds.add(layoutItem.id);return Promise.resolve();case this.STATE_REMOVING:return this._removingPromise.then(this.installForLayout.bind(this,layoutItem),this.installForLayout.bind(this,layoutItem));default:throw new Error('LayoutDictionary: Invalid state.');}};LayoutDictionary.prototype.removeForLayout=function(layoutItem){switch(this.state){case this.STATE_PRELOADED:throw new Error('LayoutDictionary: '+'Can\'t remove a dictionary under this state.');case this.STATE_INSTALLABLE:return Promise.resolve();case this.STATE_INSTALLING_CANCELLABLE:if(!this._installingLayoutDeferreds.has(layoutItem)){return Promise.resolve();} +var deferred=this._installingLayoutDeferreds.get(layoutItem);deferred.reject('Cancelled');this._installingLayoutDeferreds.delete(layoutItem);if(this._installingLayoutDeferreds.size>0){return deferred.promise.catch(function(){});} +this._downloader.abort();return this._installingPromise.catch(function(){});case this.STATE_INSTALLING:if(!this._installingLayoutDeferreds.has(layoutItem)){return Promise.resolve();} +deferred=this._installingLayoutDeferreds.get(layoutItem);deferred.reject('Cancelled');this._installingLayoutDeferreds.delete(layoutItem);if(this._installingLayoutDeferreds.size>0){return deferred.promise.catch(function(){});} +return this._installingPromise.catch(function(){});case this.STATE_INSTALLED:if(!this.installedLayoutIds.has(layoutItem.id)){return Promise.resolve();} +if(this.installedLayoutIds.size>1){this.installedLayoutIds.delete(layoutItem.id);return Promise.resolve();} +this._startRemove();this._removingPromise=this._removingPromise.then(function(){this.installedLayoutIds.delete(layoutItem.id);}.bind(this));return this._removingPromise;case this.STATE_REMOVING:if(this.installedLayoutIds.has(layoutItem.id)){return this._removingPromise;} +return Promise.resolve();default:throw new Error('LayoutDictionary: Invalid state.');}};LayoutDictionary.prototype._startInstall=function(){if(this.state!==this.STATE_INSTALLABLE){throw new Error('LayoutDictionary: '+'Can\'t start install a dictionary under this state.');} +this.state=this.STATE_INSTALLING_CANCELLABLE;this.downloadLoadedSize=0;this.downloadTotalSize=this.fileSize;this._downloader=new LayoutDictionaryDownloader(this.imEngineId,this.filename);this._downloader.onprogress=this._updateProgress.bind(this);this._installingPromise=this._downloader.load().then(function(data){this._downloader=null;this.state=this.STATE_INSTALLING;return this.dbStore.setItem(this.databaseId,data);}.bind(this)).then(function(){this._installingPromise=null;this._installingLayoutDeferreds.forEach(function(deferred,layoutItem){this.installedLayoutIds.add(layoutItem.id);deferred.resolve();},this);this._installingLayoutDeferreds.clear();this.state=this.STATE_INSTALLED;this.downloadLoadedSize=0;this.downloadTotalSize=0;}.bind(this)).catch(function(e){console.warn('LayoutDictionary: Installation failed with error:',e);this._downloader=null;this._installingPromise=null;this._installingLayoutDeferreds.forEach(function(deferred){deferred.reject('Failed');},this);this._installingLayoutDeferreds.clear();this.state=this.STATE_INSTALLABLE;this.downloadLoadedSize=0;this.downloadTotalSize=0;}.bind(this)).then(function(){if(this.state===this.STATE_INSTALLED&&this._installingLayoutDeferreds.size===0&&this.installedLayoutIds.size===0){return this._startRemove();}}.bind(this));};LayoutDictionary.prototype._startRemove=function(){if(this.state!==this.STATE_INSTALLED){throw new Error('LayoutDictionary: '+'Can\'t start remove a dictionary under this state.');} +this.state=this.STATE_REMOVING;this._removingPromise=this.dbStore.deleteItem(this.databaseId).then(function(){this._removingPromise=null;this.state=this.STATE_INSTALLABLE;}.bind(this)).catch(function(e){this._removingPromise=null;this.state=this.STATE_INSTALLED;throw e;}.bind(this));};LayoutDictionary.prototype._updateProgress=function(loaded,total){this.downloadLoadedSize=loaded;this.downloadTotalSize=total;Array.from(this._installingLayoutDeferreds).map(function(keyValue){return keyValue[0];}).forEach(function(layoutItem){layoutItem.updateInstallProgress(loaded,total);});};exports.LayoutDictionary=LayoutDictionary;}(window));;'use strict';(function(exports){var LayoutDictionaryList=function LayoutDictionaryList(layoutList){this.dbStore=null;this.dictionaries=null;};LayoutDictionaryList.prototype.DATABASE_NAME='imEngineData';LayoutDictionaryList.prototype.start=function(){this.dictionaries=new Map();this.dbStore=new PromiseStorage(this.DATABASE_NAME);this.dbStore.start();};LayoutDictionaryList.prototype.stop=function(){this.dictionaries.forEach(function(dict){dict.stop();});this.dictionaries=null;this.dbStore.stop();this.dbStore=null;};LayoutDictionaryList.prototype.getDictionary=function(imEngineId,dictFilePath){var databaseId=imEngineId+'/'+dictFilePath;return this.dictionaries.get(databaseId);};LayoutDictionaryList.prototype.createDictionariesFromLayouts=function createDictionariesFromLayouts(layouts){var dictsMap=this._getDictsMapFromLayouts(layouts);dictsMap.forEach(function(dict,databaseId){var layoutDict=new LayoutDictionary(this,dict);layoutDict.start();this.dictionaries.set(databaseId,layoutDict);},this);};LayoutDictionaryList.prototype._getDictsMapFromLayouts=function(layouts){var dictsMap=new Map();layouts.forEach(function(layout){if(!layout.dictFilename){return;} +var dict;var databaseId=layout.imEngineId+'/'+layout.dictFilePath;if(dictsMap.has(databaseId)){if(layout.installed){dict=dictsMap.get(databaseId);dict.installedLayoutIds.add(layout.id);} +return;} +dict={imEngineId:layout.imEngineId,filename:layout.dictFilename,filePath:layout.dictFilePath,fileSize:layout.dictFileSize,databaseId:databaseId,preloaded:layout.preloaded,installedLayoutIds:new Set()};if(layout.installed){dict.installedLayoutIds.add(layout.id);} +dictsMap.set(databaseId,dict);});return dictsMap;};exports.LayoutDictionaryList=LayoutDictionaryList;}(window));;'use strict';(function(exports){var LayoutItemErrorInfo=function(layoutItemState){switch(layoutItemState){case LayoutItem.prototype.STATE_INSTALLING_CANCELLABLE:this.error=this.ERROR_DOWNLOADERROR;break;case LayoutItem.prototype.STATE_INSTALLING:this.error=this.ERROR_INSTALLERROR;break;case LayoutItem.prototype.STATE_REMOVING:this.error=this.ERROR_REMOVEERROR;break;default:throw new Error('LayoutItemErrorInfo: Error at invalid state.');}};LayoutItemErrorInfo.prototype.ERROR_DOWNLOADERROR=1;LayoutItemErrorInfo.prototype.ERROR_INSTALLERROR=2;LayoutItemErrorInfo.prototype.ERROR_REMOVEERROR=3;var LayoutItem=function(list,layout){this.list=list;this.id=layout.id;this.name=layout.name;this.nameL10nId=layout.nameL10nId;this.imEngineId=layout.imEngineId;this.dictFilePath=layout.dictFilePath;this.fileSize=layout.dictFileSize;this.types=layout.types;if(layout.preloaded){this.state=this.STATE_PRELOADED;}else if(layout.installed){this.state=this.STATE_INSTALLED;}else{this.state=this.STATE_INSTALLABLE;} +this._dictionary=null;this._userCancelled=undefined;};LayoutItem.prototype.STATE_PRELOADED=1;LayoutItem.prototype.STATE_INSTALLABLE=2;LayoutItem.prototype.STATE_INSTALLING_CANCELLABLE=3;LayoutItem.prototype.STATE_INSTALLING=4;LayoutItem.prototype.STATE_INSTALLED=5;LayoutItem.prototype.STATE_REMOVING=6;LayoutItem.prototype.onerror=null;LayoutItem.prototype.onstatechange=null;LayoutItem.prototype.onprogress=null;LayoutItem.prototype.oninstall=null;LayoutItem.prototype.id='';LayoutItem.prototype.name='';LayoutItem.prototype.nameL10nId='';LayoutItem.prototype.types=null;LayoutItem.prototype.fileSize=0;LayoutItem.prototype.downloadLoadedSize=0;LayoutItem.prototype.downloadTotalSize=0;LayoutItem.prototype.start=function(){if(this.state!==this.STATE_PRELOADED){this._dictionary=this.list.dictionaryList.getDictionary(this.imEngineId,this.dictFilePath);}};LayoutItem.prototype.stop=function(){};LayoutItem.prototype.install=function(){if(this.state!==this.STATE_INSTALLABLE){throw new Error('LayoutItem: '+'Can\'t install a layout under this state.');} +var openLock=this.list.closeLockManager.requestLock('stayAwake');this._userCancelled=false;var p=Promise.resolve().then(function(){var p=this._dictionary.installForLayout(this);if(this._dictionary.state===this._dictionary.STATE_INSTALLING_CANCELLABLE){this.downloadLoadedSize=this._dictionary.downloadLoadedSize;this.downloadTotalSize=this._dictionary.downloadTotalSize;this._changeState(this.STATE_INSTALLING_CANCELLABLE);}else{this._changeState(this.STATE_INSTALLING);} +return p;}.bind(this)).then(function(){if(this.state!==this.STATE_INSTALLING){this.downloadLoadedSize=0;this.downloadTotalSize=0;this._changeState(this.STATE_INSTALLING);} +return navigator.mozInputMethod.addInput(this.id,{launch_path:'/index.html#'+this.id,name:this.name,description:this.name,types:this.types});}.bind(this)).then(this.list.setLayoutAsInstalled.bind(this.list,this.id)).then(function(){this._userCancelled=undefined;openLock.unlock();this._changeState(this.STATE_INSTALLED);if(typeof this.oninstall==='function'){this.oninstall();}}.bind(this)).catch(function(e){if(!this._userCancelled){this._triggerError();} +this._userCancelled=undefined;this.downloadLoadedSize=0;this.downloadTotalSize=0;openLock.unlock();this._changeState(this.STATE_INSTALLABLE);throw(e||new Error('LayoutItem: Installation failed/cancelled.'));}.bind(this));return p;};LayoutItem.prototype.cancelInstall=function(){if(this.state!==this.STATE_INSTALLING_CANCELLABLE){throw new Error('LayoutItem: '+'Can\'t cancel an install under this state.');} +this._userCancelled=true;this._dictionary.removeForLayout(this);};LayoutItem.prototype.remove=function(){if(this.state!==this.STATE_INSTALLED){throw new Error('LayoutItem: '+'Can\'t remove a layout under this state.');} +var openLock=this.list.closeLockManager.requestLock('stayAwake');var p=Promise.resolve().then(function(){this._changeState(this.STATE_REMOVING);return navigator.mozInputMethod.removeInput(this.id);}.bind(this)).then(function(){return this.list.setLayoutAsUninstalled(this.id).catch(function(e){console.error('LayoutItem: Ignoring set uninstall failure.',e);});}.bind(this)).then(function(){return this._dictionary.removeForLayout(this).catch(function(e){console.error('LayoutItem: Ignoring dictionary removal failure.',e);});}.bind(this)).then(openLock.unlock.bind(openLock)).then(this._changeState.bind(this,this.STATE_INSTALLABLE)).catch(function(e){this._triggerError();openLock.unlock();this._changeState(this.STATE_INSTALLED);throw(e||new Error('LayoutItem: Removing failed.'));}.bind(this));return p;};LayoutItem.prototype.updateInstallProgress=function(loaded,total){if(this.state!==this.STATE_INSTALLING_CANCELLABLE){console.warn('LayoutItem: Ignoring updateInstallProgress call in the wrong state.');return;} +this.downloadLoadedSize=loaded;this.downloadTotalSize=total;if(typeof this.onprogress==='function'){return this.onprogress(loaded,total);}};LayoutItem.prototype._triggerError=function(){if(typeof this.onerror==='function'){this.onerror(new LayoutItemErrorInfo(this.state));}};LayoutItem.prototype._changeState=function(state){this.state=state;if(typeof this.onstatechange==='function'){return this.onstatechange();}};exports.LayoutItemErrorInfo=LayoutItemErrorInfo;exports.LayoutItem=LayoutItem;}(window));;'use strict';(function(exports){var DownloadPreference=function(app){this.app=app;};DownloadPreference.prototype.STATE_PROMPT=0;DownloadPreference.prototype.STATE_ALLOW=1;DownloadPreference.prototype.STATE_DENY=2;DownloadPreference.prototype.PREF_DOWNLOAD_ON_DATA_CONNTECION='download.prompt-on-data-connection';DownloadPreference.prototype.start=function(){};DownloadPreference.prototype.stop=function(){};DownloadPreference.prototype.getCurrentState=function(){if(!this._isUsingDataConnection()){return Promise.resolve(this.STATE_ALLOW);} +return this.app.preferencesStore.getItem(this.PREF_DOWNLOAD_ON_DATA_CONNTECION).then(function(val){switch(val){case undefined:return this.STATE_PROMPT;case true:return this.STATE_ALLOW;case false:return this.STATE_DENY;default:console.error('DownloadPreference: Unknown preference.',val);return this.STATE_PROMPT;}}.bind(this),function(e){e&&console.error(e);return this.STATE_PROMPT;}.bind(this));};DownloadPreference.prototype.setDataConnectionDownloadState=function(state){switch(state){case this.STATE_PROMPT:return this.app.preferencesStore.deleteItem(this.PREF_DOWNLOAD_ON_DATA_CONNTECION);case this.STATE_ALLOW:return this.app.preferencesStore.setItem(this.PREF_DOWNLOAD_ON_DATA_CONNTECION,true);case this.STATE_DENY:return this.app.preferencesStore.setItem(this.PREF_DOWNLOAD_ON_DATA_CONNTECION,false);default:throw new Error('DownloadPreference: Unknown state.');}};DownloadPreference.prototype._isUsingDataConnection=function(){if(!navigator.mozMobileConnections){console.warn('DownloadPreference: mozMobileConnections is not available. '+'Assuming no data charges.');return false;} +var mobileDataConnected=Array.prototype.some.call(navigator.mozMobileConnections,function(conn){return(conn.data&&conn.data.connected);});return mobileDataConnected;};var LayoutEnabler=function(app){this.app=app;this.appManifestURL='';};LayoutEnabler.prototype.SETTING_ENABLE_LAYOUT_KEY='keyboard.enabled-layouts';LayoutEnabler.prototype.start=function(){this.appManifestURL=location.protocol+'//'+location.hostname+'/manifest.webapp';};LayoutEnabler.prototype.stop=function(){this.appManifestURL=null;};LayoutEnabler.prototype.enableLayout=function(id){return this.app.settingsPromiseManager.updateOne(this.SETTING_ENABLE_LAYOUT_KEY,function(obj){if(!obj[this.appManifestURL]){obj[this.appManifestURL]={};} +obj[this.appManifestURL][id]=true;return obj;}.bind(this));};LayoutEnabler.prototype.disableLayout=function(id){return this.app.settingsPromiseManager.updateOne(this.SETTING_ENABLE_LAYOUT_KEY,function(obj){if(!obj[this.appManifestURL]){obj[this.appManifestURL]={};} +delete obj[this.appManifestURL][id];return obj;}.bind(this));};var LayoutItemList=function(app){this.app=app;this.closeLockManager=app.closeLockManager;this.dictionaryList=null;this.downloadPreference=null;this.layoutEnabler=null;this._layoutConfigQueue=null;this._installedLayoutListSet=null;this.layoutItems=null;};LayoutItemList.prototype.ENABLED_LAYOUT_KEY='layout.dynamic-installed';LayoutItemList.prototype.CONFIG_FILE_PATH='./js/settings/layouts.json';LayoutItemList.prototype.onready=null;LayoutItemList.prototype.start=function(){this.dictionaryList=new LayoutDictionaryList(this);this.dictionaryList.start();this.downloadPreference=new DownloadPreference(this.app);this.downloadPreference.start();this.layoutEnabler=new LayoutEnabler(this.app);this.layoutEnabler.start();this.layoutItems=new Map();var p=this._getConfig().then(this._createLayoutItemsFromLayouts.bind(this)).then(function(){if(typeof this.onready==='function'){this.onready();}}.bind(this));this._layoutConfigQueue=p.catch(function(e){e&&console.error(e);});return p;};LayoutItemList.prototype.stop=function(){this.layoutItems.forEach(function(layoutItem){layoutItem.stop();});this.dictionaryList.stop();this.dictionaryList=null;this.downloadPreference.stop();this.downloadPreference=null;this.layoutEnabler.stop();this.layoutEnabler=null;this._layoutConfigQueue=null;this._installedLayoutListSet=null;};LayoutItemList.prototype.setLayoutAsInstalled=function(layoutId){var p=this._layoutConfigQueue.then(function(){this._installedLayoutListSet.add(layoutId);return this.app.preferencesStore.setItem(this.ENABLED_LAYOUT_KEY,Array.from(this._installedLayoutListSet));}.bind(this)).catch(function(e){this._installedLayoutListSet.delete(layoutId);throw e;});this._layoutConfigQueue=p.catch(function(e){e&&console.error(e);});return p;};LayoutItemList.prototype.setLayoutAsUninstalled=function(layoutId){var p=this._layoutConfigQueue.then(function(){this._installedLayoutListSet.delete(layoutId);return this.app.preferencesStore.setItem(this.ENABLED_LAYOUT_KEY,Array.from(this._installedLayoutListSet));}.bind(this)).catch(function(e){this._installedLayoutListSet.add(layoutId);throw e;});this._layoutConfigQueue=p.catch(function(e){e&&console.error(e);});return p;};LayoutItemList.prototype._getConfig=function(){var xhrPromise=new Promise(function(resolve,reject){var xhr=new XMLHttpRequest();xhr.open('GET',this.CONFIG_FILE_PATH);xhr.responseType='json';xhr.onload=function(){if(xhr.response){resolve(xhr.response);}else{reject();}};xhr.onerror=function(){reject();};xhr.send();}.bind(this));var installedLayoutsPromise=this.app.preferencesStore.getItem(this.ENABLED_LAYOUT_KEY);var p=Promise.all([xhrPromise,installedLayoutsPromise]).then(function(values){var layouts=values[0];var installedLayoutListSet=this._installedLayoutListSet=new Set(values[1]||[]);layouts.forEach(function(layout){layout.installed=layout.preloaded||installedLayoutListSet.has(layout.id);});return layouts;}.bind(this));return p;};LayoutItemList.prototype._createLayoutItemsFromLayouts=function(layouts){var needDownload=layouts.some(function(layout){return(layout.preloaded===false);});if(!needDownload){return;} +this.dictionaryList.createDictionariesFromLayouts(layouts);layouts.forEach(function(layout){var layoutItem=new LayoutItem(this,layout);layoutItem.start();this.layoutItems.set(layout.id,layoutItem);},this);};exports.LayoutItemList=LayoutItemList;exports.DownloadPreference=DownloadPreference;exports.LayoutEnabler=LayoutEnabler;}(window));;'use strict';(function(exports){var LayoutItemView=function(list,layoutItem){BaseView.apply(this);this._statusEl=null;this._progressEl=null;if(typeof layoutItem!=='object'){throw new Error('LayoutItemView: '+'LayoutItemView does not create a LayoutItem for itself, '+'please pass an approate instance as the model.');} +this.list=list;this._model=layoutItem;};LayoutItemView.prototype=Object.create(BaseView.prototype);LayoutItemView.prototype.oninlistchange=null;LayoutItemView.prototype.inList=undefined;LayoutItemView.prototype.IN_LIST_INSTALLED=0;LayoutItemView.prototype.IN_LIST_INSTALLABLE=1;LayoutItemView.prototype.TEMPLATE_ID='installable-keyboard-list-item';LayoutItemView.prototype.start=function(){this._model.onerror=this._showError.bind(this);this._model.onprogress=this._updateProgress.bind(this);this._model.onstatechange=this._updateUI.bind(this);this._model.oninstall=this._showEnableDialog.bind(this);var template=document.getElementById(this.TEMPLATE_ID);var el=this.container=document.importNode(template.content,true).firstElementChild;el.querySelector('.label').textContent=this._model.name;if(this._model.nameL10nId){el.querySelector('.label').dataset.l10nId=this._model.nameL10nId;} +el.addEventListener('click',this);this._statusEl=el.querySelector('.status');this._progressEl=el.querySelector('.progress');this._updateUI();};LayoutItemView.prototype._updateProgress=function(){var loadedSizeData=this._getHumanFileSize(this._model.downloadLoadedSize);var totalSizeData=this._getHumanFileSize(this._model.downloadTotalSize);this._progressEl.value=this._model.downloadLoadedSize;this._progressEl.max=this._model.downloadTotalSize;this._statusEl.dataset.l10nArgs=JSON.stringify({loadedSize:loadedSizeData.size,loadedSizeUnit:loadedSizeData.localizedUnit,totalSize:totalSizeData.size,totalSizeUnit:totalSizeData.localizedUnit});};LayoutItemView.prototype._updateUI=function(){var fileSizeData;var loadedSizeData;var totalSizeData;var item=this._model;switch(item.state){case item.STATE_PRELOADED:this.container.dataset.enabledAction='none';this._statusEl.dataset.l10nId='preInstalledStatus';fileSizeData=this._getHumanFileSize(item.fileSize);this._statusEl.dataset.l10nArgs=JSON.stringify({size:fileSizeData.size,sizeUnit:fileSizeData.localizedUnit});this._progressEl.classList.add('hide');this._updateList(this.IN_LIST_INSTALLED);break;case item.STATE_INSTALLABLE:this.container.dataset.enabledAction='download';this._statusEl.dataset.l10nId='installableStatus';fileSizeData=this._getHumanFileSize(item.fileSize);this._statusEl.dataset.l10nArgs=JSON.stringify({size:fileSizeData.size,sizeUnit:fileSizeData.localizedUnit});this._progressEl.classList.add('hide');this._updateList(this.IN_LIST_INSTALLABLE);break;case item.STATE_INSTALLING_CANCELLABLE:this.container.dataset.enabledAction='cancel-download';this._statusEl.dataset.l10nId='downloadingStatus';loadedSizeData=this._getHumanFileSize(item.downloadLoadedSize);totalSizeData=this._getHumanFileSize(item.downloadTotalSize);this._statusEl.dataset.l10nArgs=JSON.stringify({loadedSize:loadedSizeData.size,loadedSizeUnit:loadedSizeData.localizedUnit,totalSize:totalSizeData.size,totalSizeUnit:totalSizeData.localizedUnit});this._progressEl.classList.remove('hide');this._progressEl.value=item.downloadLoadedSize;this._progressEl.max=item.downloadTotalSize;this._updateList(this.IN_LIST_INSTALLABLE);break;case item.STATE_INSTALLING:this.container.dataset.enabledAction='none';this._statusEl.dataset.l10nId='downloadingStatus';fileSizeData=this._getHumanFileSize(item.fileSize);this._statusEl.dataset.l10nArgs=JSON.stringify({loadedSize:fileSizeData.size,loadedSizeUnit:fileSizeData.localizedUnit,totalSize:fileSizeData.size,totalSizeUnit:fileSizeData.localizedUnit});this._progressEl.classList.remove('hide');this._progressEl.value=this._progressEl.max=item.fileSize;this._updateList(this.IN_LIST_INSTALLABLE);break;case item.STATE_INSTALLED:this.container.dataset.enabledAction='remove';this._statusEl.dataset.l10nId='installedStatus';fileSizeData=this._getHumanFileSize(item.fileSize);this._statusEl.dataset.l10nArgs=JSON.stringify({size:fileSizeData.size,sizeUnit:fileSizeData.localizedUnit});this._progressEl.classList.add('hide');this._updateList(this.IN_LIST_INSTALLED);break;case item.STATE_REMOVING:this.container.dataset.enabledAction='none';this._statusEl.dataset.l10nId='removingStatus';delete this._statusEl.dataset.l10nArgs;this._progressEl.classList.add('hide');this._updateList(this.IN_LIST_INSTALLED);break;}};LayoutItemView.prototype._showEnableDialog=function(){this.list.confirmEnable(this._model.name).then(function(confirmed){if(confirmed){return this.list.enableLayout(this._model.id);}}.bind(this)).catch(function(e){e&&console.error(e);});};LayoutItemView.prototype._showError=function(errorInfo){switch(errorInfo.error){case errorInfo.ERROR_DOWNLOADERROR:this.list.showDownloadErrorToast();break;case errorInfo.ERROR_INSTALLERROR:console.error('LayoutItemView: layout installation error.');break;case errorInfo.ERROR_REMOVEERROR:console.error('LayoutItemView: layout removal error.');break;default:console.error('LayoutItemView: undefined onerror call,',errorInfo);break;}};LayoutItemView.prototype.handleEvent=function(evt){var el=evt.target;var p;switch(el.dataset.action){case'download':p=this.list.confirmDownload().then(function(confirmed){if(confirmed){return this._model.install();}}.bind(this));break;case'cancelDownload':p=this._model.cancelInstall();break;case'remove':p=this.list.confirmRemoval(this._model.name).then(function(confirmed){if(!confirmed){return;} +return this.list.disableLayout(this._model.id).then(function(){return this._model.remove();}.bind(this));}.bind(this));break;} +if(p){p.catch(function(e){e&&console.error(e);});}};LayoutItemView.prototype.stop=function(){this._model.onprogress=null;this._model.onstatechange=null;this.container.removeEventListener('click',this);this.container=null;};LayoutItemView.prototype._updateList=function(newListState){if(newListState===this.inList){return;} +if(typeof this.inList==='undefined'){this.inList=newListState;return;} +this.inList=newListState;if(typeof this.oninlistchange==='function'){this.oninlistchange();}};LayoutItemView.prototype._getHumanFileSize=function(sizeInNumber){var _=navigator.mozL10n.get;var sizeString='';var localizedUnit='';if(sizeInNumber>(1<<30)){sizeString=(sizeInNumber/(1<<30)).toFixed(2);localizedUnit=_('byteUnit-GB');}else if(sizeInNumber>(1<<20)){sizeString=(sizeInNumber/(1<<20)).toFixed(2);localizedUnit=_('byteUnit-MB');}else if(sizeInNumber>(1<<10)){sizeString=(sizeInNumber/(1<<10)).toFixed(2);localizedUnit=_('byteUnit-KB');}else{sizeString=sizeInNumber.toFixed(2);localizedUnit=_('byteUnit-B');} +sizeString=sizeString.replace(/\.?0*$/,'');return{size:sizeString,localizedUnit:localizedUnit};};exports.LayoutItemView=LayoutItemView;}(window));;'use strict';(function(exports){var LayoutItemDownloadErrorToastView=function(){BaseView.apply(this);this._isVisible=false;this._showDelayed=false;};LayoutItemDownloadErrorToastView.prototype=Object.create(BaseView.prototype);LayoutItemDownloadErrorToastView.prototype.CONTAINER_ID='installable-keyboards-download-error-toast';LayoutItemDownloadErrorToastView.prototype.start=function(){BaseView.prototype.start.call(this);this._isVisible=false;this._showDelayed=false;};LayoutItemDownloadErrorToastView.prototype.stop=function(){BaseView.prototype.stop.call(this);this._isVisible=false;this._showDelayed=false;};LayoutItemDownloadErrorToastView.prototype.show=function(){BaseView.prototype.show.call(this);this._isVisible=true;if(this._showDelayed){this.container.show();this._showDelayed=false;}};LayoutItemDownloadErrorToastView.prototype.beforeHide=function(){BaseView.prototype.beforeHide.call(this);this._isVisible=false;this.container.hide();};LayoutItemDownloadErrorToastView.prototype.showToast=function(){if(!this._isVisible){this._showDelayed=true;return;} +this.container.show();};var Deferred=function(){this.promise=new Promise(function(resolve,reject){this.resolve=resolve;this.reject=reject;}.bind(this));};var DialogInfo=function(args){this.args=args;this.deferred=new Deferred();};var ConfirmationDialogBaseView=function(){BaseView.apply(this);this._isVisible=false;this._isShown=undefined;this._currentDialogInfo=null;this._delayedDialogInfo=null;};ConfirmationDialogBaseView.prototype=Object.create(BaseView.prototype);ConfirmationDialogBaseView.prototype.CONTAINER_ID=undefined;ConfirmationDialogBaseView.prototype.start=function(){if(!this.CONTAINER_ID){throw new Error('ConfirmationDialogBaseView: CONTAINER_ID unset.');} +BaseView.prototype.start.call(this);this._delayedDialogInfo=[];this.container.hidden=true;this._isShown=false;this.container.addEventListener('confirm',this);this.container.addEventListener('cancel',this);};ConfirmationDialogBaseView.prototype.stop=function(){this.container.removeEventListener('confirm',this);this.container.removeEventListener('cancel',this);this._delayedDialogInfo.forEach(function(info){info.deferred.reject('stopped');});this._delayedDialogInfo=null;BaseView.prototype.stop.call(this);};ConfirmationDialogBaseView.prototype.show=function(){BaseView.prototype.show.call(this);this._isVisible=true;this._maybeShowNextDelayedDialog();};ConfirmationDialogBaseView.prototype.handleEvent=function(evt){switch(evt.type){case'confirm':this.hideDialog(true);break;case'cancel':this.hideDialog(false);break;default:throw new Error('ConfirmationDialogBaseView: Unknown event.');}};ConfirmationDialogBaseView.prototype.showDialog=function(){var info=new DialogInfo(Array.prototype.slice.call(arguments));this._delayedDialogInfo.push(info);this._maybeShowNextDelayedDialog();return info.deferred.promise;};ConfirmationDialogBaseView.prototype.beforeShowDialog=function(){};ConfirmationDialogBaseView.prototype._maybeShowNextDelayedDialog=function(){if(!this._delayedDialogInfo.length||!this._isVisible||this._isShown){return;} +var info=this._delayedDialogInfo.shift();this.beforeShowDialog.apply(this,info.args);this.container.hidden=false;this._isShown=true;this._currentDialogInfo=info;};ConfirmationDialogBaseView.prototype.beforeHide=function(){this._isVisible=false;if(this._isShown){this.hideDialog(false);} +BaseView.prototype.beforeHide.call(this);};ConfirmationDialogBaseView.prototype.hideDialog=function(confirmed){if(!this._isShown){throw new Error('ConfirmationDialogBaseView: hideDialog() called when not shown.');} +this._currentDialogInfo.deferred.resolve(confirmed);this.container.hidden=true;this._isShown=false;this._currentDialogInfo=null;this._maybeShowNextDelayedDialog();};var LayoutItemRemovalConfirmationDialogView=function(){ConfirmationDialogBaseView.apply(this);};LayoutItemRemovalConfirmationDialogView.prototype=Object.create(ConfirmationDialogBaseView.prototype);LayoutItemRemovalConfirmationDialogView.prototype.CONTAINER_ID='installable-keyboards-removal-dialog';LayoutItemRemovalConfirmationDialogView.prototype.beforeShowDialog=function(label){ConfirmationDialogBaseView.prototype.beforeShowDialog(this);this.container.firstElementChild.dataset.l10nArgs=JSON.stringify({keyboard:label});};var LayoutItemDataConnectionConfirmationDialogView=function(){ConfirmationDialogBaseView.apply(this);this.rememberMyChoiceElement=null;};LayoutItemDataConnectionConfirmationDialogView.prototype=Object.create(ConfirmationDialogBaseView.prototype);LayoutItemDataConnectionConfirmationDialogView.prototype.CONTAINER_ID='installable-keyboards-mobile-download-dialog';LayoutItemDataConnectionConfirmationDialogView.prototype.REMEMBER_MY_CHOICE_ID='installable-keyboards-remember';LayoutItemDataConnectionConfirmationDialogView.prototype.start=function(){ConfirmationDialogBaseView.prototype.start.apply(this);this.rememberMyChoiceElement=document.getElementById(this.REMEMBER_MY_CHOICE_ID);};LayoutItemDataConnectionConfirmationDialogView.prototype.stop=function(){ConfirmationDialogBaseView.prototype.stop.apply(this);this.rememberMyChoiceElement=null;};LayoutItemDataConnectionConfirmationDialogView.prototype.beforeShowDialog=function(){ConfirmationDialogBaseView.prototype.beforeShowDialog(this);this.rememberMyChoiceElement.checked=false;};LayoutItemDataConnectionConfirmationDialogView.prototype.shouldRemember=function(){return this.rememberMyChoiceElement.checked;};var LayoutItemEnableConfirmationDialogView=function(){ConfirmationDialogBaseView.apply(this);};LayoutItemEnableConfirmationDialogView.prototype=Object.create(ConfirmationDialogBaseView.prototype);LayoutItemEnableConfirmationDialogView.prototype.CONTAINER_ID='installable-keyboards-enable-dialog';LayoutItemEnableConfirmationDialogView.prototype.beforeShowDialog=function(label){ConfirmationDialogBaseView.prototype.beforeShowDialog(this);this.container.firstElementChild.dataset.l10nArgs=JSON.stringify({keyboard:label});};var LayoutItemListView=function(app){BaseView.apply(this);this.app=app;this._model=null;this._installableListContainer=null;this._installedListContainer=null;};LayoutItemListView.prototype=Object.create(BaseView.prototype);LayoutItemListView.prototype.CONTAINER_ID='installable-keyboard';LayoutItemListView.prototype.INSTALLED_LIST_ID='installed-keyboards-list';LayoutItemListView.prototype.INSTALLABLE_LIST_ID='installable-keyboards-list';LayoutItemListView.prototype.start=function(){BaseView.prototype.start.call(this);this._model=new LayoutItemList(this.app);this._model.onready=this._handleModelReady.bind(this);this._model.start();this.childViews.removeDialog=new LayoutItemRemovalConfirmationDialogView();this.childViews.removeDialog.start();this.childViews.downloadErrorToast=new LayoutItemDownloadErrorToastView();this.childViews.downloadErrorToast.start();this.childViews.dataConnectionDialog=new LayoutItemDataConnectionConfirmationDialogView();this.childViews.dataConnectionDialog.start();this.childViews.enableDialog=new LayoutItemEnableConfirmationDialogView();this.childViews.enableDialog.start();this._installedListContainer=document.getElementById(this.INSTALLED_LIST_ID);this._installableListContainer=document.getElementById(this.INSTALLABLE_LIST_ID);};LayoutItemListView.prototype.confirmDownload=function(){var downloadPreference=this._model.downloadPreference;return downloadPreference.getCurrentState().then(function(state){switch(state){case downloadPreference.STATE_PROMPT:return this._showConfirmDownloadDialog();case downloadPreference.STATE_ALLOW:return true;case downloadPreference.STATE_DENY:return false;}}.bind(this));};LayoutItemListView.prototype._showConfirmDownloadDialog=function(){var downloadPreference=this._model.downloadPreference;var dataConnectionDialog=this.childViews.dataConnectionDialog;return dataConnectionDialog.showDialog().then(function(confirmed){if(confirmed&&dataConnectionDialog.shouldRemember()){downloadPreference.setDataConnectionDownloadState(downloadPreference.STATE_ALLOW).catch(function(e){e&&console.error(e);});} +return confirmed;}.bind(this));};LayoutItemListView.prototype.confirmRemoval=function(layoutName){return this.childViews.removeDialog.showDialog(layoutName);};LayoutItemListView.prototype.confirmEnable=function(layoutName){return this.childViews.enableDialog.showDialog(layoutName);};LayoutItemListView.prototype.disableLayout=function(id){return this._model.layoutEnabler.disableLayout(id);};LayoutItemListView.prototype.enableLayout=function(id){return this._model.layoutEnabler.enableLayout(id);};LayoutItemListView.prototype.showDownloadErrorToast=function(){this.childViews.downloadErrorToast.showToast();};LayoutItemListView.prototype._handleModelReady=function(){this._model.onready=null;var layoutItems=this._model.layoutItems;if(layoutItems.size===0){return;} +this.container.hidden=false;this._model.layoutItems.forEach(function(layoutItem,layoutId){var layoutItemView=this.childViews[layoutId]=new LayoutItemView(this,layoutItem);layoutItemView.oninlistchange=function(){Array.from(this._model.layoutItems).map(function(keyValue){return keyValue[0];}).forEach(function(id){this._putItemViewInList(this.childViews[id]);}.bind(this));}.bind(this);layoutItemView.start();this._putItemViewInList(layoutItemView);},this);};LayoutItemListView.prototype._putItemViewInList=function(layoutItemView){var container;switch(layoutItemView.inList){case layoutItemView.IN_LIST_INSTALLED:container=this._installedListContainer;break;case layoutItemView.IN_LIST_INSTALLABLE:container=this._installableListContainer;break;default:throw new Error('LayoutItemListView: '+'Unknown inList state of child view.');} +container.appendChild(layoutItemView.container);};LayoutItemListView.prototype.stop=function(){BaseView.prototype.stop.call(this);this._model.onready=null;this._model.stop();this._model=null;this._installedListContainer=null;for(var id in this.childViews){this.childViews[id].stop();this.childViews[id]=null;}};exports.LayoutItemDownloadErrorToastView=LayoutItemDownloadErrorToastView;exports.LayoutItemRemovalConfirmationDialogView=LayoutItemRemovalConfirmationDialogView;exports.LayoutItemListView=LayoutItemListView;}(window));;;'use strict';(function(exports){var KeyboardSettingsApp=function KeyboardSettingsApp(){this.closeLockManager=null;this.settingsPromiseManager=null;this.preferencesStore=null;this.panelController=null;this.dialogController=null;this._closeLock=null;};KeyboardSettingsApp.prototype.PREFERENCES_STORE_NAME='preferences';KeyboardSettingsApp.prototype.start=function(){this.closeLockManager=new CloseLockManager();this.closeLockManager.onclose=this.close.bind(this);this.closeLockManager.start();this.settingsPromiseManager=new SettingsPromiseManager();this.preferencesStore=new PromiseStorage(this.PREFERENCES_STORE_NAME);this.preferencesStore.start();this.panelController=new PanelController(this);this.panelController.start();this.dialogController=new DialogController();this.dialogController.start();document.addEventListener('visibilitychange',this);};KeyboardSettingsApp.prototype.stop=function(){this.closeLockManager.stop();this.closeLockManager=null;this.settingsPromiseManager=null;this.preferencesStore.stop();this.preferencesStore=null;this.panelController.stop();this.panelController=null;this.dialogController.stop();this.dialogController=null;document.removeEventListener('visibilitychange',this);};KeyboardSettingsApp.prototype.close=function(){this.stop();window.close();};KeyboardSettingsApp.prototype.requestClose=function(){Promise.resolve(new MozActivity({name:'moz_configure_window',data:{target:'device'}})).catch(function(e){console.error(e);});};KeyboardSettingsApp.prototype.handleEvent=function(evt){if(document.hidden){this._closeLock=this.closeLockManager.requestLock('requestClose');}else if(this._closeLock){this._closeLock.unlock();this._closeLock=null;}};exports.KeyboardSettingsApp=KeyboardSettingsApp;})(window);;'use strict';(function(exports){var app=new KeyboardSettingsApp();app.start();exports.app=app;})(window); \ No newline at end of file diff --git a/overrides/settings.gaiamobile.org/js/main.js b/overrides/settings.gaiamobile.org/js/main.js index a45439d4..f680450b 100644 --- a/overrides/settings.gaiamobile.org/js/main.js +++ b/overrides/settings.gaiamobile.org/js/main.js @@ -223,10 +223,124 @@ break;} var cset={};cset[key]=value;_settings.createLock().set(cset);}};});define('modules/settings_panel',['require','modules/panel','modules/settings_cache','modules/panel_utils'],function(require){'use strict';var Panel=require('modules/panel');var SettingsCache=require('modules/settings_cache');var PanelUtils=require('modules/panel_utils');var _emptyFunc=function panel_emptyFunc(){};var SettingsPanel=function ctor_SettingsPanel(options){var _panel=null;var _settingsChangeHandler=function(event){PanelUtils.onSettingsChange(_panel,event);};var _addListeners=function panel_addListeners(panel){if(!panel){return;} SettingsCache.addEventListener('settingsChange',_settingsChangeHandler);panel.addEventListener('change',PanelUtils.onInputChange);panel.addEventListener('click',PanelUtils.onLinkClick);};var _removeListeners=function panel_removeListeners(panel){if(!panel){return;} SettingsCache.removeEventListener('settingsChange',_settingsChangeHandler);panel.removeEventListener('change',PanelUtils.onInputChange);panel.removeEventListener('click',PanelUtils.onLinkClick);};options=options||{};options.onInit=options.onInit||_emptyFunc;options.onUninit=options.onUninit||_emptyFunc;options.onShow=options.onShow||_emptyFunc;options.onHide=options.onHide||_emptyFunc;options.onBeforeShow=options.onBeforeShow||_emptyFunc;options.onBeforeHide=options.onBeforeHide||_emptyFunc;return Panel({onInit:function(panel,initOptions){if(!panel){return;} -_panel=panel;PanelUtils.activate(panel);return options.onInit(panel,initOptions);},onUninit:function(){_removeListeners(_panel);_panel=null;options.onUninit();},onShow:function(panel,showOptions){return options.onShow(panel,showOptions);},onHide:function(){_removeListeners(_panel);return options.onHide();},onBeforeShow:function(panel,beforeShowOptions){PanelUtils.preset(panel);_addListeners(panel);return options.onBeforeShow(panel,beforeShowOptions);},onBeforeHide:function(){return options.onBeforeHide();}});};return SettingsPanel;});define('modules/panel_cache',['require','modules/settings_panel','shared/lazy_loader'],function(require){'use strict';var SettingsPanel=require('modules/settings_panel');var LazyLoader=require('shared/lazy_loader');var _panelCache={};var _panelStylesheetsLoaded=false;var _loadPanelStylesheetsIfNeeded=function loadPanelCSS(){if(_panelStylesheetsLoaded){return;} -LazyLoader.load(['shared/style/action_menu.css','shared/style/confirm.css','shared/style/progress_activity.css','shared/elements/gaia-icons/bidi-helper.css','shared/elements/gaia_buttons/script.js','shared/elements/gaia_confirm/script.js','style/homescreens.css','style/apps.css','style/screen_lock.css','style/simcard.css','style/updates.css','style/downloads.css','style/developer_service_workers.css'],function callback(){_panelStylesheetsLoaded=true;});};navigator.addIdleObserver({time:3,onidle:_loadPanelStylesheetsIfNeeded});return{reset:function spc_reset(){_panelCache={};_panelStylesheetsLoaded=false;},get:function spc_get(panelId,callback){if(!panelId&&!callback){return;} -if(panelId!=='root'){_loadPanelStylesheetsIfNeeded();} -var cachedPanel=_panelCache[panelId];if(cachedPanel){if(callback){callback(cachedPanel);}}else{var panelElement=document.getElementById(panelId);if(panelElement){var pathElement=panelElement.querySelector('panel');var path=pathElement?pathElement.dataset.path:null;var panelFuncLoaded=function(panelFunc){var panel=panelFunc();_panelCache[panelId]=panel;if(callback){callback(panel);}};if(path){require([path],function(panelFunc){panelFuncLoaded(panelFunc?panelFunc:SettingsPanel);});}else{panelFuncLoaded(SettingsPanel);}}else{if(callback){callback(null);}}}}};});var ScreenLayout={defaultQueries:{tiny:'(max-width: 767px)',small:'(min-width: 768px) and (max-width: 991px)',medium:'(min-width: 992px) and (max-width: 1200px)',large:'(min-width: 1201px)',hardwareHomeButton:window.VulpesCompat?'(min-width: 0px)':'(-moz-physical-home-button)'},init:function sl_init(){this.queries=(function(qs){var result={};for(var key in qs){result[key]=window.matchMedia(qs[key]);} +_panel=panel;PanelUtils.activate(panel);return options.onInit(panel,initOptions);},onUninit:function(){_removeListeners(_panel);_panel=null;options.onUninit();},onShow:function(panel,showOptions){return options.onShow(panel,showOptions);},onHide:function(){_removeListeners(_panel);return options.onHide();},onBeforeShow:function(panel,beforeShowOptions){PanelUtils.preset(panel);_addListeners(panel);return options.onBeforeShow(panel,beforeShowOptions);},onBeforeHide:function(){return options.onBeforeHide();}});};return SettingsPanel;});define('modules/panel_cache',["require", "modules/settings_panel", "shared/lazy_loader"],function(require) { + 'use strict'; + + var SettingsPanel = require('modules/settings_panel'); + var LazyLoader = require('shared/lazy_loader'); + + var _panelCache = {}; + var _panelStylesheetsLoaded = false; + + // experiment result shows + // load all related styles once is time saver + var _loadPanelStylesheetsIfNeeded = function loadPanelCSS() { + if (_panelStylesheetsLoaded) { + return; + } + + LazyLoader.load(['shared/style/action_menu.css', + 'shared/style/confirm.css', + 'shared/style/progress_activity.css', + 'shared/elements/gaia-icons/bidi-helper.css', + 'shared/elements/gaia_buttons/script.js', + 'shared/elements/gaia_confirm/script.js', + 'style/homescreens.css', + // Bug 1210284 - disabling achievements until they are on + // the roadmap again or completely removed. + // 'style/achievements.css', + 'style/apps.css', + 'style/screen_lock.css', + 'style/simcard.css', + 'style/updates.css', + 'style/downloads.css', + 'style/developer_service_workers.css'], + function callback() { + _panelStylesheetsLoaded = true; + }); + }; + + // load styles in idle time after document loaded + navigator.addIdleObserver({ + time: 3, + onidle: _loadPanelStylesheetsIfNeeded + }); + + return { + // this is for unit test + reset: function spc_reset() { + _panelCache = {}; + _panelStylesheetsLoaded = false; + }, + + /** + * Get the panel module of a specified id. If there is no corresponding + * panel module of the id, it returns SettingsPanel. + * + * @alias module:PanelCache#get + * @param {String} panelId + * The id of the to be loaded panel. + * @param {Function} callback + * The function to be called when the panel is loaded. + */ + get: function spc_get(panelId, callback) { + if (!panelId && !callback) { + return; + } + + if (panelId !== 'root') { + _loadPanelStylesheetsIfNeeded(); + } + + var cachedPanel = _panelCache[panelId]; + if (cachedPanel) { + if (callback) { + callback(cachedPanel); + } + } else { + // Get the path of the panel creation function + var panelElement = document.getElementById(panelId); + if (panelElement) { + var pathElement = panelElement.querySelector('panel'); + var path = pathElement ? pathElement.dataset.path : null; + + var panelFuncLoaded = function(panelFunc) { + var panel; + try { + panel = panelFunc(); + if (!panel || typeof panel.beforeShow !== 'function') { + throw new TypeError('Invalid settings panel: ' + panelId); + } + } catch (error) { + if (callback) callback(null, error); + return; + } + _panelCache[panelId] = panel; + if (callback) { + callback(panel); + } + }; + + if (path) { + require([path], function(panelFunc) { + // Create a new panel object for static panels. + panelFuncLoaded(panelFunc ? panelFunc : SettingsPanel); + }, function(error) { + if (callback) callback(null, error); + }); + } else { + panelFuncLoaded(SettingsPanel); + } + } else { + if (callback) { + callback(null); + } + } + } + } + }; +}); +var ScreenLayout={defaultQueries:{tiny:'(max-width: 767px)',small:'(min-width: 768px) and (max-width: 991px)',medium:'(min-width: 992px) and (max-width: 1200px)',large:'(min-width: 1201px)',hardwareHomeButton:window.VulpesCompat?'(min-width: 0px)':'(-moz-physical-home-button)'},init:function sl_init(){this.queries=(function(qs){var result={};for(var key in qs){result[key]=window.matchMedia(qs[key]);} return result;})(this.defaultQueries);},_isOnRealDevice:undefined,isOnRealDevice:function sl_isOnRealDevice(){if(typeof(this._isOnRealDevice)!=='undefined'){return this._isOnRealDevice;} if(window.innerWidth===screen.availWidth){this._isOnRealDevice=true;}else{this._isOnRealDevice=false;} return this._isOnRealDevice;},getCurrentLayout:function sl_getCurrentLayout(type){if(type===undefined){for(var name in this.defaultQueries){if(this.queries[name]&&this.queries[name].matches){return name;}}} @@ -443,7 +557,12 @@ define('modules/settings_service',["require", "modules/page_transitions", "modul } _loadPanel(panelId, function() { - PanelCache.get(panelId, function(panel) { + PanelCache.get(panelId, function(panel, loadError) { + if (loadError || !panel) { + console.error('Settings panel ' + panelId + ':', loadError); + callback(loadError || new Error('Missing settings panel: ' + panelId)); + return; + } var newPanelElement = document.getElementById(panelId); var currentPanelId = _currentNavigation && _currentNavigation.panelId; diff --git a/release.json b/release.json index 7eb7c4a2..d7b51032 100644 --- a/release.json +++ b/release.json @@ -1,15 +1,15 @@ { "gaia": "2.7.0", "channel": "preview", - "revision": 20, - "androidVersionCode": 20, + "revision": 21, + "androidVersionCode": 21, "geckoview": "156.0.20260921121718", "engineAlignment": { "family": "156", "patchParity": false, "reason": "Firefox desktop 156.0.1; Mozilla's GeckoView release repository currently offers 156.0 only. Keep the desktop patch and report actual engine versions." }, - "version": "2.7-preview.20", + "version": "2.7-preview.21", "adapters": { "desktop": "0.1.0-dev", "android": "0.1.0-dev" diff --git a/tests/android-input-bridge.test.mjs b/tests/android-input-bridge.test.mjs index ae1e5893..804569f0 100644 --- a/tests/android-input-bridge.test.mjs +++ b/tests/android-input-bridge.test.mjs @@ -3,10 +3,10 @@ import assert from 'node:assert/strict'; import vm from 'node:vm'; import {readFileSync} from 'node:fs'; const source=readFileSync(new URL('../android/extension/content.js',import.meta.url),'utf8'); -async function setup(enabled=true) { - const sent=[],events=new Map();let receive; +async function setup(enabled=true,{defer=false,activeElement}={}) { + const sent=[],events=new Map(),timers=[];let receive,disconnect; const page={navigator:{},dispatchEvent(){}}; - const port={postMessage:m=>sent.push(m),onMessage:{addListener:fn=>receive=fn},onDisconnect:{addListener(){}}}; + const port={postMessage:m=>sent.push(m),onMessage:{addListener:fn=>receive=fn},onDisconnect:{addListener:fn=>disconnect=fn}}; class Editor { constructor(){this.editing=false;} focus(e){this.inputElement=e;} @@ -14,14 +14,14 @@ async function setup(enabled=true) { edit(){return this.state();} } const context={InputEditor:Editor,browser:{runtime:{connect:()=>port}},console, - location:{port:'18765',hostname:'sms.localhost'},document:{hidden:false}, + location:{port:'18765',hostname:'sms.localhost'},document:{hidden:false,activeElement,hasFocus:()=>true}, window:{wrappedJSObject:page,Promise,Error,Event,CustomEvent:class extends Event{constructor(name,p){super(name);this.detail=p.detail;}}}, cloneInto:x=>x,exportFunction:(fn,obj,p)=>{obj[p.defineAs]=fn;}, - addEventListener:(name,fn)=>events.set(name,fn),setTimeout,clearTimeout}; + addEventListener:(name,fn)=>events.set(name,fn),setTimeout:fn=>timers.push(fn),clearTimeout(){}}; vm.runInNewContext(source,context); - receive({id:sent[0].id,reply:{result:enabled}}); + if(!defer) receive({id:sent[0].id,reply:{result:enabled}}); await new Promise(resolve=>setImmediate(resolve)); - return {sent,events,page,receive,context}; + return {sent,events,page,receive,context,timers,disconnect}; } function field(mode='numeric') { const attrs=new Map([['inputmode',mode]]); @@ -51,3 +51,54 @@ test('Android keyboard remains the default and hidden Gaia restores the editor m assert.equal(e.getAttribute('inputmode'),'numeric'); assert.equal(s.sent.at(-1).inputFocus,null); }); + +test('a field focused before the preference arrives activates Gaia without another tap',async()=>{ + const e=field(),s=await setup(true,{defer:true,activeElement:e}); + s.events.get('focusin')({target:e}); + assert.equal(s.sent.length,1); + s.receive({id:s.sent[0].id,reply:{result:true}}); + await new Promise(resolve=>setImmediate(resolve)); + assert.equal(e.getAttribute('inputmode'),'none'); + assert.equal(s.sent.at(-1).inputFocus.inputMode,'numeric'); +}); + +test('an old preference reply cannot undo a newer keyboard toggle',async()=>{ + const e=field(),s=await setup(false,{defer:true,activeElement:e}); + s.receive({event:{type:'input-mode',data:{enabled:true}}}); + s.receive({id:s.sent[0].id,reply:{result:false}}); + await new Promise(resolve=>setImmediate(resolve)); + assert.equal(s.page.VulpesNativeInput,true); + assert.equal(e.getAttribute('inputmode'),'none'); +}); + +test('returning to an app restores its focused Gaia editor',async()=>{ + const e=field(),s=await setup(true,{activeElement:e}); + s.context.document.hidden=true;s.events.get('visibilitychange')(); + assert.equal(s.sent.at(-1).inputFocus,null); + s.context.document.hidden=false;s.events.get('visibilitychange')(); + assert.equal(s.sent.at(-1).inputFocus.inputMode,'numeric'); + assert.equal(e.getAttribute('inputmode'),'none'); +}); + +test('bridge reconnection rereads the preference and restores the active editor',async()=>{ + const e=field(),s=await setup(true,{activeElement:e}); + s.disconnect(); + assert.equal(e.getAttribute('inputmode'),'numeric'); + assert.equal(s.page.VulpesNativeInput,false); + s.timers.at(-1)(); + const request=s.sent.at(-1); + assert.equal(request.request.method,'input.config'); + s.receive({id:request.id,reply:{result:true}}); + await new Promise(resolve=>setImmediate(resolve)); + assert.equal(e.getAttribute('inputmode'),'none'); + assert.equal(s.sent.at(-1).inputFocus.inputMode,'numeric'); +}); + +test('a background app cannot reclaim the keyboard when Android resumes',async()=>{ + const e=field(),s=await setup(true,{activeElement:e}); + s.context.document.hidden=true;s.events.get('visibilitychange')(); + s.context.document.hidden=false;s.context.document.hasFocus=()=>false; + s.events.get('visibilitychange')(); + assert.equal(s.sent.at(-1).inputFocus,null); + assert.equal(e.getAttribute('inputmode'),'numeric'); +}); diff --git a/tests/android-personal-data.test.mjs b/tests/android-personal-data.test.mjs new file mode 100644 index 00000000..66f34be5 --- /dev/null +++ b/tests/android-personal-data.test.mjs @@ -0,0 +1,59 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {readFileSync} from 'node:fs'; +import {Contacts} from '../host/Contacts.sys.mjs'; +import {Messages} from '../host/Messages.sys.mjs'; +const source=readFileSync('android/extension/personal-data.mjs','utf8') + .replace("'./Contacts.mjs'",JSON.stringify(new URL('../host/Contacts.sys.mjs',import.meta.url).href)) + .replace("'./Messages.mjs'",JSON.stringify(new URL('../host/Messages.sys.mjs',import.meta.url).href)); +const {AndroidPersonalData,authorizePersonal,smsFromAndroid}=await import('data:text/javascript;base64,'+Buffer.from(source).toString('base64')); +const app={id:'communications',manifest:{permissions:{contacts:{access:'readwrite'}}}}; +const smsApp={id:'sms',manifest:{permissions:{sms:{},contacts:{access:'readonly'}}}}; +async function setup(){ + const data=new Map([['vulpes-private-contacts',{revision:1,contacts:[{id:'local-1',name:['Local']}]}],['vulpes-private-messages',[{id:100,threadId:200,timestamp:1,body:'Local',delivery:'sent',receiver:'5550100',type:'sms',read:true}]]]); + const storage={run:async(name,op,args)=>{if(op==='get')return {value:structuredClone(data.get(name))};data.set(name,structuredClone(args[0]));}}; + const contacts=new Contacts(storage,()=>{});await contacts.init(); + const calls=[];let allowed=true; + const service=new AndroidPersonalData(async p=>{calls.push(p);if(p.operation==='status')return {contacts:allowed,sms:allowed};return {rows:p.kind==='contacts'?[{_id:1,display_name:'Android',tel:[{value:'5550199'}]}]:[{_id:1,thread_id:2,address:'5550199',body:'Android SMS',date:2,type:1,read:0,status:-1}],next:null};},contacts,new Messages(storage),storage); + return {service,data,calls,revoke(){allowed=false;}}; +} +test('native contact reads preserve the local address book and search phone numbers',async()=>{ + const s=await setup();const rows=await s.service.contactRequest(app,{operation:'all'}); + assert.deepEqual(rows.map(r=>r.id),['local-1','android:1']); + assert.equal((await s.service.contactRequest(app,{operation:'find',options:{filterBy:['tel'],filterOp:'match',filterValue:'0199'}}))[0].id,'android:1'); + assert.equal(s.data.get('vulpes-private-contacts').contacts.length,1); + s.revoke();assert.equal((await s.service.contactRequest(app,{operation:'all'})).length,1); +}); +test('native messages and threads remain distinct from local IDs and are not copied to storage',async()=>{ + const s=await setup();const rows=await s.service.messageRequest(smsApp,{operation:'getThreads'}); + assert.deepEqual(rows.map(r=>r.id),[-2,200]); + const [sms]=await s.service.messageRequest(smsApp,{operation:'getMessages',args:[{threadId:-2}]});assert.equal(sms.id,-1);assert.equal(sms.body,'Android SMS'); + assert.equal(s.data.get('vulpes-private-messages').length,1); + s.revoke();assert.equal((await s.service.messageRequest(smsApp,{operation:'getThreads'})).length,1); +}); +test('Android writes never fall through to the local store or report false success',async()=>{ + const s=await setup(); + for(const params of [{operation:'save',contact:{id:'android:1'}},{operation:'remove',id:'android:1'},{operation:'clear'}]) await assert.rejects(s.service.contactRequest(app,params),/READ_ONLY/); + for(const params of [{operation:'delete',args:[[100,-1]]},{operation:'markMessageRead',args:[-1,true]}])await assert.rejects(s.service.messageRequest(smsApp,params),/READ_ONLY/); + assert.equal(s.data.get('vulpes-private-messages').length,1); +}); +test('untrusted installed apps cannot reuse the Android permission granted to Gaia',async()=>{ + const s=await setup(); + assert.equal((await s.service.contactRequest({...app,installed:true},{operation:'all'})).length,1); + assert.equal((await s.service.messageRequest({...smsApp,installed:true},{operation:'getMessages'})).length,1); + assert.equal(s.calls.length,0); + assert.throws(()=>authorizePersonal({...app,installed:true},'contacts','page'),/PERMISSION/); + assert.throws(()=>authorizePersonal(smsApp,'calls','page'),/PERMISSION/); + assert.throws(()=>authorizePersonal(app,'contacts','permission'),/PERMISSION/); + assert.doesNotThrow(()=>authorizePersonal({id:'settings'},'sms','permission')); +}); +test('provider errors and stalled page cursors are surfaced, not presented as an empty book',async()=>{ + const s=await setup();let n=0; + s.service.native=async p=>p.operation==='status'?{contacts:true}:{rows:[],next:++n===1?1:1}; + await assert.rejects(s.service.rows('contacts'),/INVALID_CURSOR/); + s.service.native=async()=>{throw Error('denied');};await assert.rejects(s.service.rows('contacts'),/denied/); +}); +test('SMS mapping does not turn pending or failed sends into delivered messages',()=>{ + for(const [type,delivery] of [[1,'received'],[2,'sent'],[4,'sending'],[5,'error'],[6,'sending']])assert.equal(smsFromAndroid({_id:1,thread_id:1,type}).delivery,delivery); + assert.throws(()=>smsFromAndroid({_id:Infinity,thread_id:1}),/INVALID_ANDROID_ID/); +}); diff --git a/tests/android-personal-ui.test.mjs b/tests/android-personal-ui.test.mjs new file mode 100644 index 00000000..b39fca8d --- /dev/null +++ b/tests/android-personal-ui.test.mjs @@ -0,0 +1,85 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import vm from 'node:vm'; +import {readFileSync} from 'node:fs'; +function setup(app,path,call){ + const events=new Map(),notices=[]; + const context={console,URL,Map,Set,Number,JSON,Date,Promise,queueMicrotask,setTimeout,clearTimeout,setInterval,clearInterval, + location:{hostname:app+'.localhost',pathname:path},navigator:{language:'en'},localStorage:{removeItem(){}}, + document:{hidden:false,documentElement:{lang:'en'},readyState:'complete',addEventListener:(type,fn)=>events.set('document-'+type,fn),querySelectorAll(){return[];}}, + MutationObserver:class{observe(){}},addEventListener:(type,fn)=>events.set(type,fn), + VulpesCompat:{call},VulpesGaiaUI:{notice:value=>notices.push(value)}}; + context.window=context;vm.runInNewContext(readFileSync('android/ui/android-ui.js','utf8'),context); + return {context,events,notices}; +} +test('native call rows use Gaia grouping and expose details without changing the local DB',async()=>{ + const s=setup('communications','/dialer/index.html',async(_method,p)=>p.operation==='status'?{calls:true}:[ + {_id:1,date:1000,number:'5550199',duration:42,type:2}, + {_id:2,date:2000,number:'5550199',duration:0,type:2}]); + let localReads=0; + s.context.CallLogDBManager={getGroupList(){localReads++;},getGroup(){localReads++;},getGroupAtPosition(){localReads++;}, + _getGroupId:r=>[0,r.number,r.type],_getGroupObject:g=>({...g,id:g.id.join('-'),type:g.id[2]})}; + const db=s.context.CallLogDBManager; + const rows=await new Promise(resolve=>db.getGroupList(resolve,'lastEntryDate',true,false)); + assert.equal(rows.length,1);assert.equal(rows[0].retryCount,2);assert.equal(rows[0].calls[1].duration,42000); + assert.equal((await db.getGroup('5550199',1000,'dialing')).calls.length,2);assert.equal(localReads,0); + const streamed=[]; + await new Promise(resolve=>db.getGroupList(c=>{if(!c.value)return resolve();streamed.push(c.value);c.continue();},'lastEntryDate',true,true)); + assert.equal(streamed.length,1); +}); +test('SMS provider change refreshes the open conversation without reloading or touching the draft',async()=>{ + const inserted=[]; + const s=setup('sms','/index.html',async()=>[{id:-1,threadId:-2,body:'Received',timestamp:1000}]); + s.context.Navigation={isCurrentPanel:name=>name==='thread'}; + s.context.ConversationView={activeThread:{id:-2},appendMessage:async message=>inserted.push(message)}; + s.context.Compose={getText:()=> 'Unsent draft'}; + s.context.document.getElementById=()=>null; + s.context.location.reload=()=>{throw Error('draft lost');}; + s.events.get('vulpes-service-event')({detail:{type:'android-data-changed',data:{kind:'sms'}}}); + await new Promise(resolve=>setImmediate(resolve)); + assert.equal(inserted.length,1);assert.equal(inserted[0].body,'Received'); + assert.equal(s.context.Compose.getText(),'Unsent draft'); +}); + +test('hidden call log refreshes contact names when shown after Android access changes',()=>{ + const s=setup('communications','/dialer/index.html',async()=>({})); + let updates=0; + s.context.CallLog={sticky:{},_contactCache:true,updateListWithContactInfo(){updates++;}}; + s.context.document.hidden=true; + s.events.get('vulpes-service-event')({detail:{type:'android-data-changed',data:{kind:'contacts'}}}); + assert.equal(updates,0); + s.context.document.hidden=false; + s.events.get('visibilitychange')(); + assert.equal(updates,1); + assert.equal(s.context.CallLog._contactCache,false); +}); + +test('Android contact HTML caches are disabled before Gaia can apply stale names',async()=>{ + const s=setup('communications','/contacts/index.html',async()=>({})); + try { + let writes=0; + s.context.Cache={get enabled(){return true;},get active(){return true;},set firstChunk(value){writes++;},apply:async()=> 'stale names'}; + assert.equal(s.context.Cache.enabled,false); + assert.equal(s.context.Cache.active,false); + s.context.Cache.firstChunk={cache:'Android names'}; + assert.equal(writes,0); + await assert.rejects(s.context.Cache.apply()); + } finally{s.events.get('pagehide')();} +}); + +test('revoked native contact details close when the hidden app becomes visible',async()=>{ + const s=setup('communications','/contacts/index.html',async()=>[]); + try { + let closed=0; + s.context.MainNavigation={currentView:()=> 'view-contact-details'}; + s.context.Contacts={goBack(){closed++;}}; + s.events.get('document-click')({target:{closest:()=>({dataset:{uuid:'android:1'}})}}); + s.context.document.hidden=true; + s.events.get('vulpes-service-event')({detail:{type:'android-data-changed',data:{kind:'contacts'}}}); + assert.equal(closed,0); + s.context.document.hidden=false; + s.events.get('visibilitychange')(); + await new Promise(resolve=>setImmediate(resolve)); + assert.equal(closed,1); + } finally{s.events.get('pagehide')();} +}); diff --git a/tests/call-log-contacts.test.mjs b/tests/call-log-contacts.test.mjs new file mode 100644 index 00000000..8c2e4b32 --- /dev/null +++ b/tests/call-log-contacts.test.mjs @@ -0,0 +1,20 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import vm from 'node:vm'; +import {readFileSync} from 'node:fs'; + +for (const file of ['gaia/apps/communications/dialer/js/call_log.js', + 'assets/webapps/communications.gaiamobile.org/dialer/js/call_log.js']) { + test(`call log resolves contacts in its newly rendered section: ${file}`, () => { + const context = {navigator:{mozContacts:{}},window:{}}; + vm.runInNewContext(readFileSync(file,'utf8'),context); + const log = context.CallLog, items = [], lookedUp = []; + const list = {appendChild:row=>items.push(row),querySelectorAll:()=>items}; + log.createSectionForGroup=()=>({getElementsByTagName:()=>[list]}); + log.createGroup=group=>({dataset:{phoneNumber:group.number}}); + log.callLogContainer={appendChild(){}}; + log._updateContact=(_node,number)=>lookedUp.push(number); + log.renderChunk([{number:'5550199'}]); + assert.deepEqual(lookedUp,['5550199']); + }); +} diff --git a/tests/keyboard-dictionaries.test.mjs b/tests/keyboard-dictionaries.test.mjs new file mode 100644 index 00000000..f4991d54 --- /dev/null +++ b/tests/keyboard-dictionaries.test.mjs @@ -0,0 +1,24 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import vm from 'node:vm'; +import {readFileSync} from 'node:fs'; +const root=new URL('../',import.meta.url); +const source=readFileSync(new URL('gaia/apps/keyboard/js/settings/layout_dictionary_downloader.js',root),'utf8'); +test('every offered Latin dictionary is present and has a valid header',()=>{ + const layouts=JSON.parse(readFileSync(new URL('assets/webapps/keyboard.gaiamobile.org/js/settings/layouts.json',root))); + for(const name of new Set(layouts.filter(l=>l.imEngineId==='latin'&&l.dictFilename).map(l=>l.dictFilename))){ + const data=readFileSync(new URL('gaia/apps/keyboard/js/imes/latin/dictionaries/'+name,root)); + assert.equal(data.subarray(0,8).toString(),'FxOSDICT',name); + } +}); +test('adding a language reads and verifies its local dictionary',async()=>{ + let requested,aborted=false; + class XHR { + open(method,url){requested=url;} + send(){const b=readFileSync(new URL('gaia/apps/keyboard'+requested,root));this.response=b.buffer.slice(b.byteOffset,b.byteOffset+b.byteLength);this.onloadend();} + abort(){aborted=true;} + } + const window={};vm.runInNewContext(source,{window,XMLHttpRequest:XHR,ArrayBuffer,Uint8Array,Promise}); + const data=await new window.LayoutDictionaryDownloader('latin','it.dict').load(); + assert.equal(requested,'/js/imes/latin/dictionaries/it.dict');assert.ok(data.byteLength>8);assert.equal(aborted,false); +}); diff --git a/tests/keyboard-startup.test.mjs b/tests/keyboard-startup.test.mjs new file mode 100644 index 00000000..9b7641d8 --- /dev/null +++ b/tests/keyboard-startup.test.mjs @@ -0,0 +1,40 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import vm from 'node:vm'; +import {readFileSync} from 'node:fs'; + +const source=readFileSync(new URL('../host/gaia-input.js',import.meta.url),'utf8'); +function keyboard() { + const listeners=new Map();let reply; + const parent={postMessage(){}}; + const context={VulpesNativeInput:true,location:{hostname:'keyboard.localhost'}, + VulpesCompat:{call:()=>new Promise(resolve=>reply=resolve)}, + navigator:{},document:{readyState:'loading'},parent,console,Event,EventTarget, + CustomEvent:class extends Event {constructor(name,options){super(name);this.detail=options.detail;}}, + addEventListener(name,fn){listeners.set(name,fn);},dispatchEvent(){}}; + context.window=context; + vm.runInNewContext(source,context); + return { + ime:context.navigator.mozInputMethod, + state:value=>listeners.get('vulpes-service-event')({detail:{type:'input-focus',data:value}}), + reply:value=>reply(value), + viewport:()=>listeners.get('message')({source:parent,origin:'http://system.localhost:8765', + data:{type:'vulpes-keyboard-viewport',width:360,height:740}}) + }; +} +test('an old empty snapshot cannot clear a newly focused keyboard',async()=>{ + const k=keyboard();k.viewport();k.state({id:2,text:'current'});k.reply(null); + await new Promise(resolve=>setImmediate(resolve)); + assert.equal(k.ime.inputcontext.text,'current'); +}); +test('an old active snapshot cannot reopen a dismissed keyboard',async()=>{ + const k=keyboard();k.viewport();k.state(null);k.reply({id:1,text:'old'}); + await new Promise(resolve=>setImmediate(resolve)); + assert.equal(k.ime.inputcontext,null); +}); +test('focus received before viewport measurement survives a stale initial reply',async()=>{ + const k=keyboard();k.state({id:3,text:'pending'});k.reply(null); + await new Promise(resolve=>setImmediate(resolve)); + k.viewport(); + assert.equal(k.ime.inputcontext.text,'pending'); +}); diff --git a/tests/marketplace-navigation.test.mjs b/tests/marketplace-navigation.test.mjs new file mode 100644 index 00000000..bf8ae8e6 --- /dev/null +++ b/tests/marketplace-navigation.test.mjs @@ -0,0 +1,34 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import vm from 'node:vm'; +import {readFileSync} from 'node:fs'; +const source=readFileSync(new URL('../gaia/apps/marketplace/marketplace.js',import.meta.url),'utf8'); +function element(){return Object.assign(new EventTarget(),{style:{},hidden:false,textContent:''});} +async function setup() { + const nodes=Object.fromEntries(['catalogue','message','confirm','open','browse','install','cancel','status','title','question','permissions'].map(id=>[id,element()])); + let poll,download=null,finish; + const context={document:{getElementById:id=>nodes[id]},navigator:{language:'en'},console, + addEventListener(){},setInterval:fn=>poll=fn,VulpesCompat:{call:async method=>{ + if(method==='locale.current')return 'en'; + if(method==='marketplace.poll'){const url=download;download=null;return url;} + if(method==='marketplace.prepare')return new Promise(resolve=>finish=resolve); + }}}; + await vm.runInNewContext(source,context); + return {nodes,poll,setDownload:()=>download='https://vulpes-os.org/marketplace/index.php?download=1',finish:()=>finish({name:'Test',bytes:1024,token:'test'})}; +} +test('closing the Android web view exposes a way back to the catalogue, not a blank frame',async()=>{ + const {nodes:n}=await setup(); + n.catalogue.dispatchEvent(new Event('mozbrowserclose')); + assert.equal(n.message.hidden,false);assert.equal(n.catalogue.style.visibility,'hidden'); + assert.match(n.status.textContent,/reopen/);assert.equal(n.open.hidden,true); + n.browse.onclick(); + assert.equal(n.message.hidden,true);assert.equal(n.catalogue.style.visibility,'visible'); + assert.match(n.catalogue.src,/mode=app&lang=en/); +}); +test('a close notification cannot erase an installation confirmation',async()=>{ + const f=await setup();f.setDownload();const pending=f.poll(); + await new Promise(resolve=>setImmediate(resolve)); + f.nodes.catalogue.dispatchEvent(new Event('mozbrowserclose')); + assert.match(f.nodes.status.textContent,/Checking/); + f.finish();await pending;assert.equal(f.nodes.confirm.hidden,false); +}); diff --git a/tests/settings-panel-cache.test.mjs b/tests/settings-panel-cache.test.mjs new file mode 100644 index 00000000..01cc7e87 --- /dev/null +++ b/tests/settings-panel-cache.test.mjs @@ -0,0 +1,29 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import vm from 'node:vm'; +import {readFileSync} from 'node:fs'; +const source=readFileSync(new URL('../gaia/apps/settings/js/modules/panel_cache.js',import.meta.url),'utf8'); +function fixture(load) { + let cache; + function require(id,ok,fail) { + if(Array.isArray(id))return load(ok,fail); + if(id==='shared/lazy_loader')return {load:(_,done)=>done()}; + return ()=>({beforeShow(){}}); + } + vm.runInNewContext(source,{define:factory=>cache=factory(require),navigator:{addIdleObserver(){}}, + document:{getElementById:()=>({querySelector:()=>({dataset:{path:'panels/storage/panel'}})})}}); + return cache; +} +for(const failure of ['dependency','constructor','invalid']) test('Panel cache reports '+failure+' failure without caching a broken panel',()=>{ + let broken=true; + const expected=new Error('storage unavailable'); + const cache=fixture((ok,fail)=>{ + if(!broken)return ok(()=>({beforeShow(){}})); + if(failure==='dependency')return fail(expected); + ok(()=>{if(failure==='constructor')throw expected;return {};}); + }); + let calls=0; + cache.get('mediaStorage',(panel,error)=>{calls++;assert.equal(panel,null);assert.ok(error);}); + assert.equal(calls,1);broken=false; + cache.get('mediaStorage',(panel,error)=>{assert.equal(error,undefined);assert.equal(typeof panel.beforeShow,'function');}); +}); diff --git a/tests/settings-startup.test.mjs b/tests/settings-startup.test.mjs new file mode 100644 index 00000000..3a18412e --- /dev/null +++ b/tests/settings-startup.test.mjs @@ -0,0 +1,19 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import vm from 'node:vm'; +import {readFileSync} from 'node:fs'; +const source=readFileSync(new URL('../gaia/apps/settings/js/startup.js',import.meta.url),'utf8'); +const bootstrap=source.slice(source.lastIndexOf('(function() {')); +test('Settings waits for deferred components before loading AMD modules',()=>{ + let starts=0; + const document=Object.assign(new EventTarget(),{readyState:'interactive'}); + vm.runInNewContext(bootstrap,{document,AppStarter:()=>({start:()=>starts++})}); + assert.equal(starts,0); + document.dispatchEvent(new Event('DOMContentLoaded'));assert.equal(starts,1); + document.dispatchEvent(new Event('DOMContentLoaded'));assert.equal(starts,1); +}); +test('Settings starts immediately when loaded after the document',()=>{ + let starts=0; + vm.runInNewContext(bootstrap,{document:{readyState:'complete'},AppStarter:()=>({start:()=>starts++})}); + assert.equal(starts,1); +}); diff --git a/tests/test_changelog.py b/tests/test_changelog.py index 53aaa59d..a3ac8a12 100644 --- a/tests/test_changelog.py +++ b/tests/test_changelog.py @@ -2,6 +2,7 @@ import copy import importlib.util import json +import re from pathlib import Path import tempfile import unittest @@ -41,8 +42,8 @@ class ChangelogTests(unittest.TestCase): self.assertTrue(documents['release-body.md'].startswith(self.source['releases'][self.tag]['summary'])) for lang in export.LANGUAGES: text = documents[f'CHANGELOG.{lang}.md'] - self.assertIn('## 2.7-preview.14', text) - self.assertNotIn('## 2.7-156.0.1 ', text) + self.assertIn('## 30/09/2026 : 2.7-preview.14', text) + self.assertNotIn('## 2.7-156.0.1', text) future = copy.deepcopy(self.source['entries'][0]) future['id'] = 'future' self.source['entries'].insert(0, future) @@ -62,16 +63,47 @@ class ChangelogTests(unittest.TestCase): export.generate(p, Path(d), Path(d)/'site.json', Path(d)/'releases') self.assertFalse((Path(d)/'site.json').exists()) - def test_flat_entry_keeps_explicit_platforms_in_both_languages(self): + def test_grouped_entries_keep_explicit_platforms_in_both_languages(self): for language in export.LANGUAGES: for source, rendered in zip(self.source['entries'], self.languages[language]): self.assertEqual(rendered['platforms'], source['metadata']['platforms']) self.assertEqual(rendered['models'], source['metadata']['models']) self.assertEqual(rendered['status'], source['metadata']['status']) - self.assertEqual(rendered['groups'][0]['platforms'], rendered['platforms']) + self.assertEqual({p for group in rendered['groups'] for p in group['platforms']}, + set(rendered['platforms'])) + + def test_date_first_heading_and_platform_badges(self): + for language in export.LANGUAGES: + entry = next(e for e in self.languages[language] if e['id'] == '2.7-preview.20') + self.assertEqual(entry['id'], '2.7-preview.20') + self.assertEqual(entry['date'], '2026-10-13') + common = next(g for g in entry['groups'] if g['common']) + self.assertEqual(common['platforms'], ['pc', 'apk', 'models']) + web = next(g for g in entry['groups'] if g['name'] == 'Web') + self.assertEqual(web['platforms'], ['web']) + self.assertIn('>Web', web['nameHtml']) + self.assertEqual(entry['notes'], '') + self.assertEqual(export.group_scope('![Desktop + Sargo](https://example.org/badge)')[1], ['pc', 'models']) + with self.assertRaisesRegex(ValueError, 'Unknown platform'): + export.group_scope('Unknown') + + def test_tags_alphabetical_in_every_platform_group(self): + for entry in self.source['entries']: + for lang in export.LANGUAGES: + for group in re.split(r'^### ', entry['text'][lang], flags=re.M)[1:]: + tags = re.findall(r'^- !\[([^\]]+)\]', group, re.M) + self.assertTrue(tags, (entry['id'], lang)) + self.assertEqual(tags, sorted(tags), (entry['id'], lang)) + self.assertLessEqual(set(tags), {'Add', 'Change', 'Fix', 'Note', 'Test'}) + + def test_release_summary_follows_the_entry_without_copying_text(self): + tag = 'v2.7-preview.20' + next(e for e in self.source['entries'] if e['id'] == '2.7-preview.20')['text']['fr'] += '\nA new correction.\n' + docs = export.release_documents(self.source, tag) + self.assertIn('A new correction.', docs['release-body.md']) def test_badges_are_images_with_escaped_attributes(self): - rendered = export.inline('![Fix](https://img.shields.io/badge/Fix-52677D?style=flat-square) **Camera**') + rendered = export.inline('![Fix](https://example.org/badge.svg) **Camera**') self.assertIn('Camera', rendered) @@ -79,6 +111,11 @@ class ChangelogTests(unittest.TestCase): self.assertNotIn('Fix') + self.assertNotIn('