From be245ad5cc4f7862a5e8b3c9349806778be23b29 Mon Sep 17 00:00:00 2001 From: SahilSonar Date: Sun, 19 Apr 2026 18:56:52 +0530 Subject: [PATCH 1/2] web-installer: Move GS290 to a15 --- app/public/resources/GS290.json | 61 +++++++++++++++++++++------------ app/src/lib/adb/adb-device.ts | 5 ++- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/app/public/resources/GS290.json b/app/public/resources/GS290.json index 71e1e90..e3fdb54 100644 --- a/app/public/resources/GS290.json +++ b/app/public/resources/GS290.json @@ -1,41 +1,51 @@ { "$schema": "../schemas/devices.schema.json", + "skip_clear_halt": true, "steps": [ { - "mode": "bootloader", + "command": ["reboot bootloader", "delay 15"] + }, + { "id": "connect-bootloader", - "command": ["connect bootloader", "flashing unlock unlocked"], + "command": ["connect bootloader"], "needUserGesture": true }, { "id": "unlocking-gs290", - "needUserGesture": true + "needUserGesture": true, + "command": ["flashing unlock goto_flashing", "delay 5"] }, { "id": "flashing", "mode": "bootloader", "command": [ - "flash system system.img", - "flash vendor vendor.img", "flash boot boot.img", "flash dtbo dtbo.img", "flash recovery recovery.img", - "flash logo logo.img", - "flash md1dsp md1dsp.img", - "flash md1img md1img.img", - "flash spmfw spmfw.img", - "flash lk lk.img", - "flash lk2 lk.img", - "flash sspm_1 sspm.img", - "flash sspm_2 sspm.img", - "flash tee1 trustzone1.bin", - "flash tee2 trustzone2.bin", - "flash preloader preloader.img", - "erase userdata", - "erase metadata", - "reboot adb" + "reboot recovery" ] }, + { + "id": "format-device", + "needUserGesture": true + }, + { + "id": "go-to-apply-update", + "needUserGesture": true + }, + { + "id": "sideload", + "command": "sideload GS290-sideload-rom.zip" + }, + { + "id": "sideload-ended", + "needUserGesture": true + }, + { + "id": "connect-bootloader", + "command": ["connect bootloader", "reboot"], + "needUserGesture": true + }, { "id": "murena-workspace-account", "needUserGesture": true @@ -46,9 +56,18 @@ ], "folder": [ { - "name": "GS290 installer", + "name": "GS290-recovery-images.zip", + "path": "https://images.ecloud.global/official/GS290/recovery-IMG-e-latest-a15-official-GS290.zip", "unzip": true, - "path": "https://images.ecloud.global/official/GS290/IMG-e-latest-s-official-GS290.zip" + "mapping": { + "^dtbo.*img$": "dtbo.img", + "^boot.*img$": "boot.img", + "^recovery.*img$": "recovery.img" + } + }, + { + "name": "GS290-sideload-rom.zip", + "path": "https://images.ecloud.global/official/GS290/e-latest-a15-official-GS290.zip" } ] } diff --git a/app/src/lib/adb/adb-device.ts b/app/src/lib/adb/adb-device.ts index 360c719..ef08267 100644 --- a/app/src/lib/adb/adb-device.ts +++ b/app/src/lib/adb/adb-device.ts @@ -234,10 +234,13 @@ export class AdbDevice { onProgress?: SideloadProgressCallback, ): Promise { this.ensureConnected(); + // Set 5min as uperbound timeout; userdebug devices stop sending ack after vertification stage + // and actual install starts after that. + const SIDELOAD_TIMEOUT_MS = 5 * 60_000; await performSideload( this._transport, blob, - () => this.receivePacket(), + () => readPacket((length) => this._transport.receiveWithTimeout(length, SIDELOAD_TIMEOUT_MS)), undefined, onProgress, ); -- GitLab From 6e99ae2c3496421838574643cb6ede1381cc00c2 Mon Sep 17 00:00:00 2001 From: SahilSonar Date: Mon, 20 Apr 2026 01:02:52 +0530 Subject: [PATCH 2/2] web-installer: Add progress bar for recovery sideload --- app/src/controller/controller.manager.js | 4 +++- app/src/controller/device.manager.js | 4 ++-- app/src/controller/device/recovery.class.js | 3 ++- app/src/view/view.manager.js | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/controller/controller.manager.js b/app/src/controller/controller.manager.js index 2d0a0a2..7fd6149 100644 --- a/app/src/controller/controller.manager.js +++ b/app/src/controller/controller.manager.js @@ -374,7 +374,9 @@ export class ControllerManager { async runSideloadCommand(cmd) { try { await this.deviceManager.connect("recovery"); - await this.deviceManager.sideload(cmd.file); + await this.deviceManager.sideload(cmd.file, (block, total) => { + this.view.onInstalling(cmd.file, block, total); + }); return true; } catch (e) { throw new Error(`Sideload ${cmd.file} failed: ${e.message || e}`); diff --git a/app/src/controller/device.manager.js b/app/src/controller/device.manager.js index c84d417..9ef661c 100644 --- a/app/src/controller/device.manager.js +++ b/app/src/controller/device.manager.js @@ -301,13 +301,13 @@ export class DeviceManager { * @param {string} file Filename in downloader cache. * @returns {Promise} Sideload result from the active device. */ - async sideload(file) { + async sideload(file, onProgress) { let blob = await this.downloader.getFile(file); if (!blob) { throw new Error(`error getting blob file ${file}`); } - return await this.device.sideload(blob); + return await this.device.sideload(blob, onProgress); } /** diff --git a/app/src/controller/device/recovery.class.js b/app/src/controller/device/recovery.class.js index b6f8c44..ddb7a20 100644 --- a/app/src/controller/device/recovery.class.js +++ b/app/src/controller/device/recovery.class.js @@ -49,12 +49,13 @@ export class Recovery extends Device { * @param {Blob} blob Zip blob to sideload. * @returns {Promise} Resolves when sideload completes. */ - async sideload(blob) { + async sideload(blob, onProgress) { try { await this._adbDevice.sideload(blob, (block, totalBlocks) => { if (block % 10 === 0) { DebugManager.log(`Sideloading block ${block}/${totalBlocks}`); } + onProgress?.(block, totalBlocks); }); } catch (e) { throw new Error(`Sideload fails ${e.message || e}`); diff --git a/app/src/view/view.manager.js b/app/src/view/view.manager.js index 5650592..0ff7c45 100644 --- a/app/src/view/view.manager.js +++ b/app/src/view/view.manager.js @@ -323,7 +323,7 @@ export default class ViewManager { $progress.innerText = `Installing ${name}: ${v}/${100}`; } this.DebugManager.log( - `Installing ${name}: ${Math.round(v * 100)}/${100}`, + `Installing ${name}: ${v}/${100}`, `installing-${name}`, ); } -- GitLab