Release Preview 20 shared desktop, Android and Sargo updates

Restore Gaia settings and media workflows, extend native network adapters, and align the APK payload. Generate French/English changelogs and website entries from the simplified JSON source.

Validation: shared JS and Tundra unit tests; desktop workflows and persistence; signed APK payload parity; Sargo RAM and installed startup with boot readback. Android runtime qualification is recorded separately.
This commit is contained in:
OverSu 2026-10-13 00:19:45 +02:00
commit 1311bed5e9
170 changed files with 19698 additions and 2495 deletions

View file

@ -1,6 +1,6 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import {Input} from '../host/Input.sys.mjs';
import {Input} from '../services/input.mjs';
function setup() {
const events=[];
const input=new Input({identity:actor=>actor.app,broadcast:(...args)=>events.push(args)});
@ -30,3 +30,20 @@ test('current edit updates the focused field; keyboard focus does not replace it
input.changed(field,{text:''});input.changed(keyboard,{text:'unrelated'});
assert.equal((await input.request(keyboard,{operation:'key',id:1})).text,'123');
});
test('a composer button retains input and other buttons dismiss only after click',async()=>{
const {readFile}=await import('node:fs/promises');
const {runInNewContext}=await import('node:vm');
const source=await readFile(new URL('../host/actors/VulpesChild.sys.mjs',import.meta.url),'utf8');
const events=[];
const Actor=runInNewContext(source.replace(/^import .*;\n/, '').replace('export class','class')+';VulpesChild',{
JSWindowActorChild:class{},Services:{cpmm:{sharedData:{get:()=>true}}}
});
const actor=new Actor();actor.sendAsyncMessage=(...args)=>events.push(args);
const button={localName:'button',closest:()=>null};
actor.handleEvent({type:'pointerdown',target:button});assert.equal(events.length,0);
actor.handleEvent({type:'click',target:button});assert.equal(events.length,1);assert.equal(events[0][1],null);
button.closest=()=>button;
actor.handleEvent({type:'pointerdown',target:button});actor.handleEvent({type:'click',target:button});
assert.equal(events.length,1,'send keeps the composer focused');
});