Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 57523e0a authored by Nicolas Gelot's avatar Nicolas Gelot
Browse files

Merge branch 'use-webadb-lib' into 'main'

Webadb integration

See merge request !34
parents 9585a8e5 dc104448
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -10,7 +10,6 @@
    <link rel="stylesheet" href="/css/styles.css" />
    <link rel="stylesheet" href="/css/styles.css" />
    <link rel="stylesheet" href="/css/loader.css" />
    <link rel="stylesheet" href="/css/loader.css" />
    <title>/e/OS Installer</title>
    <title>/e/OS Installer</title>
    <script type="module" src="/src/lib/webadb/adb.bundle.js"></script>
    <script type="module" src="/src/viewManager.js"></script>
    <script type="module" src="/src/viewManager.js"></script>
    <script type="module" src="/src/before-leave-app.js"></script>
    <script type="module" src="/src/before-leave-app.js"></script>
  </head>
  </head>
+86 −0
Original line number Original line Diff line number Diff line
@@ -10,6 +10,10 @@
      "license": "GPLv3",
      "license": "GPLv3",
      "dependencies": {
      "dependencies": {
        "@e/fastboot": "1.1.4",
        "@e/fastboot": "1.1.4",
        "@yume-chan/adb": "1.1.0",
        "@yume-chan/adb-credential-web": "1.1.0",
        "@yume-chan/adb-daemon-webusb": "1.1.0",
        "@yume-chan/stream-extra": "1.0.0",
        "@zip.js/zip.js": "^2.7.54",
        "@zip.js/zip.js": "^2.7.54",
        "ky": "^1.7.4"
        "ky": "^1.7.4"
      },
      },
@@ -334,6 +338,88 @@
      "dev": true,
      "dev": true,
      "license": "MIT"
      "license": "MIT"
    },
    },
    "node_modules/@types/w3c-web-usb": {
      "version": "1.0.10",
      "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz",
      "integrity": "sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==",
      "license": "MIT"
    },
    "node_modules/@yume-chan/adb": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/@yume-chan/adb/-/adb-1.1.0.tgz",
      "integrity": "sha512-AC2HhTtxvEPrAQfMP9qDC3FI5Uc6U8j4oH+WMOQ+PKqzI4eme1X3V7OXgPNkrLTQ9SUWgLRw+lgzpvyTvNYpng==",
      "license": "MIT",
      "dependencies": {
        "@yume-chan/async": "^4.0.2",
        "@yume-chan/event": "^1.0.0",
        "@yume-chan/no-data-view": "^1.0.0",
        "@yume-chan/stream-extra": "^1.0.0",
        "@yume-chan/struct": "^1.0.0"
      }
    },
    "node_modules/@yume-chan/adb-credential-web": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/@yume-chan/adb-credential-web/-/adb-credential-web-1.1.0.tgz",
      "integrity": "sha512-jdg0JTZ1Z82gPoxtc29511aPVKPQyXRx5Nf2uRy7UXRmg5oeH6dqO5a45Li1yRo1dwAxZHShxIt90RnP7zDH0g==",
      "license": "MIT",
      "dependencies": {
        "@yume-chan/adb": "^1.1.0"
      }
    },
    "node_modules/@yume-chan/adb-daemon-webusb": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/@yume-chan/adb-daemon-webusb/-/adb-daemon-webusb-1.1.0.tgz",
      "integrity": "sha512-Q0jkEX/V/PTMZov3udN0gR4uwxfJz0EmKBmRqdJl619rXGC8OfkqlnbrOI4aOjCebm2HCc6d3jVAmjo5sIB7OQ==",
      "license": "MIT",
      "dependencies": {
        "@types/w3c-web-usb": "^1.0.10",
        "@yume-chan/adb": "^1.1.0",
        "@yume-chan/event": "^1.0.0",
        "@yume-chan/stream-extra": "^1.0.0",
        "@yume-chan/struct": "^1.0.0"
      }
    },
    "node_modules/@yume-chan/async": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/@yume-chan/async/-/async-4.0.2.tgz",
      "integrity": "sha512-YP5Hg4DZoq6CXzeTsiOu6rDNUaWw8SMiM4cB2rHam4zRTatgUHCWpSKMawQt0+nUro/+IeNTZLh2QpIFyxuGzg==",
      "license": "MIT"
    },
    "node_modules/@yume-chan/event": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/@yume-chan/event/-/event-1.0.0.tgz",
      "integrity": "sha512-tr4V34WQ5dz2UDMQl4ekj2zGLqwzmclOJpJL+9s2LJpURHw+Szy5g4gi4j86M+5epMFD8dpT9ym/wXHiUdtpsg==",
      "license": "MIT",
      "dependencies": {
        "@yume-chan/async": "^4.0.2"
      }
    },
    "node_modules/@yume-chan/no-data-view": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/@yume-chan/no-data-view/-/no-data-view-1.0.0.tgz",
      "integrity": "sha512-KrkXhJJQiCFFXb/eeHB++HCfKuwwiI7RVzHR7X/0XiwjQouxBpNpRFjEO25458Q5p/EPGprGWQ7BsHrmV3mkZQ==",
      "license": "MIT"
    },
    "node_modules/@yume-chan/stream-extra": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/@yume-chan/stream-extra/-/stream-extra-1.0.0.tgz",
      "integrity": "sha512-xltJYD5txn63e0jm7bHExmULowJTgjbsC205DN0GCxfdfrZIl6adKVheQNh1yOuOKV5Ok5luWNVSBp7Y2OVffA==",
      "license": "MIT",
      "dependencies": {
        "@yume-chan/async": "^4.0.2",
        "@yume-chan/struct": "^1.0.0"
      }
    },
    "node_modules/@yume-chan/struct": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/@yume-chan/struct/-/struct-1.0.0.tgz",
      "integrity": "sha512-PQWUjgITlZstIkLD6ouRDwmR35Z9OJZ9daOQ6ZipzQ/mCnHTeoJf2v8x2+fmGyVrrHf9oaCWe8U/XW65onRlGg==",
      "license": "MIT",
      "dependencies": {
        "@yume-chan/async": "^4.0.2",
        "@yume-chan/no-data-view": "^1.0.0"
      }
    },
    "node_modules/@zip.js/zip.js": {
    "node_modules/@zip.js/zip.js": {
      "version": "2.7.54",
      "version": "2.7.54",
      "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.54.tgz",
      "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.54.tgz",
+4 −0
Original line number Original line Diff line number Diff line
@@ -20,6 +20,10 @@
  },
  },
  "dependencies": {
  "dependencies": {
    "@e/fastboot": "1.1.4",
    "@e/fastboot": "1.1.4",
    "@yume-chan/adb": "1.1.0",
    "@yume-chan/adb-daemon-webusb": "1.1.0",
    "@yume-chan/adb-credential-web": "1.1.0",
    "@yume-chan/stream-extra": "1.0.0",
    "@zip.js/zip.js": "^2.7.54",
    "@zip.js/zip.js": "^2.7.54",
    "ky": "^1.7.4"
    "ky": "^1.7.4"
  }
  }
+14 −15
Original line number Original line Diff line number Diff line
@@ -314,10 +314,9 @@ export class Controller {
        WDebug.log("Security patch Error");
        WDebug.log("Security patch Error");
        current_security_path_level = null;
        current_security_path_level = null;
      }
      }

      let this_model = this.deviceManager.adb.webusb.transport.banner.device;
      let this_model = this.deviceManager.adb.webusb.device;
      //    https://gitlab.e.foundation/e/os/backlog/-/issues/2604#note_609234
      //    https://gitlab.e.foundation/e/os/backlog/-/issues/2604#note_609234
      const model = this.deviceManager.adb.webusb.model;
      const model = this.deviceManager.adb.webusb.transport.banner.model;
      if (model.includes("Teracube") && model.includes("2e")) {
      if (model.includes("Teracube") && model.includes("2e")) {
        try {
        try {
          const serial = await this.deviceManager.adb.getSerialNumber();
          const serial = await this.deviceManager.adb.getSerialNumber();
@@ -329,31 +328,31 @@ export class Controller {
          } else {
          } else {
            const id =
            const id =
              "model " +
              "model " +
              this.deviceManager.adb.webusb.model +
              this.deviceManager.adb.webusb.transport.banner.model +
              " " +
              " " +
              "product " +
              "product " +
              this.deviceManager.adb.webusb.product +
              this.deviceManager.adb.webusb.transport.banner.product +
              " " +
              " " +
              "name " +
              "name " +
              this.deviceManager.adb.webusb.name +
              this.deviceManager.adb.device.name +
              " " +
              " " +
              "device " +
              "device " +
              this.deviceManager.adb.webusb.device;
              this.deviceManager.adb.webusb.transport.banner.device;
            throw new Error("Cannot find device resource", id);
            throw new Error("Cannot find device resource", id);
          }
          }
        } catch {
        } catch {
          const id =
          const id =
            "model " +
            "model " +
            this.deviceManager.adb.webusb.model +
            this.deviceManager.adb.webusb.transport.banner.model +
            " " +
            " " +
            "product " +
            "product " +
            this.deviceManager.adb.webusb.product +
            this.deviceManager.adb.webusb.transport.banner.product +
            " " +
            " " +
            "name " +
            "name " +
            this.deviceManager.adb.webusb.name +
            this.deviceManager.adb.device.name +
            " " +
            " " +
            "device " +
            "device " +
            this.deviceManager.adb.webusb.device;
            this.deviceManager.adb.webusb.transport.banner.device;
          throw new Error("Error on getting device resource", id);
          throw new Error("Error on getting device resource", id);
        }
        }
      }
      }
@@ -364,16 +363,16 @@ export class Controller {
        } catch {
        } catch {
          const id =
          const id =
            "model " +
            "model " +
            this.deviceManager.adb.webusb.model +
            this.deviceManager.adb.webusb.transport.banner.model +
            " " +
            " " +
            "product " +
            "product " +
            this.deviceManager.adb.webusb.product +
            this.deviceManager.adb.webusb.transport.banner.product +
            " " +
            " " +
            "name " +
            "name " +
            this.deviceManager.adb.webusb.name +
            this.deviceManager.adb.device.name +
            " " +
            " " +
            "device " +
            "device " +
            this.deviceManager.adb.webusb.device;
            this.deviceManager.adb.webusb.transport.banner.device;
          throw new Error("Error on getting devcice resource", id);
          throw new Error("Error on getting devcice resource", id);
        }
        }
      }
      }
+45 −16
Original line number Original line Diff line number Diff line
import { Device } from "./device.class.js";
import { Device } from "./device.class.js";
import { WDebug } from "../../debug.js";
import { WDebug } from "../../debug.js";
import { AdbWebBackend, Adb2 } from "../../lib/webadb/adb.bundle.js";

import { AdbDaemonWebUsbDeviceManager } from "@yume-chan/adb-daemon-webusb";
import { Adb, AdbDaemonTransport } from "@yume-chan/adb";
import AdbWebCredentialStore from "@yume-chan/adb-credential-web";


export class ADB extends Device {
export class ADB extends Device {
  static Manager = AdbDaemonWebUsbDeviceManager.BROWSER;

  constructor(device) {
  constructor(device) {
    super(device);
    super(device);
    this.webusb = null;
    this.webusb = null;
@@ -26,28 +31,52 @@ export class ADB extends Device {
  async connect() {
  async connect() {
    try {
    try {
      console.log("debug adb connect");
      console.log("debug adb connect");
      let adbWebBackend = await AdbWebBackend.requestDevice();

      if (adbWebBackend) {
      let adbDaemonWebUsbDevice =
        let adbDevice = new Adb2(adbWebBackend, null); //adb.bundle.js
        await ADB.Manager.requestDevice(); /*AdbDaemonWebUsbDevice*/
        await adbDevice.connect();
      if (typeof adbDaemonWebUsbDevice == "undefined") {
        this.device = adbWebBackend._device;
        throw new Error("No device connected (1)");
        this.webusb = adbDevice;
      }

      let connection;
      try {
        connection =
          await adbDaemonWebUsbDevice.connect(); /*AdbDaemonWebUsbConnection*/
      } catch (err) {
        console.error(err);
        const devices = await ADB.Manager.getDevices();
        if (!devices.length) {
          throw new Error("No device connected (2)");
        }
        adbDaemonWebUsbDevice = devices[0]; /*AdbDaemonWebUsbDevice*/
      }

      const credentialStore = new AdbWebCredentialStore();
      const transport = await AdbDaemonTransport.authenticate({
        serial: connection.deserial,
        connection,
        credentialStore: credentialStore,
      });
      const adb = new Adb(transport);

      this.device = adbDaemonWebUsbDevice;
      this.webusb = adb; /*Adb*/


      WDebug.log("----------------------------------");
      WDebug.log("----------------------------------");
        WDebug.log("Model", adbDevice.model);
      WDebug.log("Model", adb.transport.banner.model);
        WDebug.log("product", adbDevice.product);
      WDebug.log("product", adb.transport.banner.product);
        WDebug.log("Name", adbDevice.name);
      WDebug.log("Name", adbDaemonWebUsbDevice.name);
        WDebug.log(">Device (codename)", adbDevice.device); // codemane
      WDebug.log(">Device (codename)", adb.transport.banner.device); // codemane
      WDebug.log("----------------------------------");
      WDebug.log("----------------------------------");
      }
    } catch (e) {
    } catch (e) {
      console.error(e);
      this.device = null;
      this.device = null;
      throw new Error(`Cannot connect ADB ${e.message || e}`);
      throw new Error(`Cannot connect ADB ${e.message || e}`);
    }
    }
  }
  }


  getProductName() {
  getProductName() {
    return this.webusb.name;
    return this.device.name;
  }
  }


  async getAndroidVersion() {
  async getAndroidVersion() {
@@ -64,7 +93,7 @@ export class ADB extends Device {
  }
  }


  async reboot(mode) {
  async reboot(mode) {
    const res = await this.webusb.createStreamAndReadAll(`reboot:${mode}`);
    const res = await this.webusb.power.reboot(mode);
    return res;
    return res;
  }
  }
}
}
Loading