[WRTjs][VD] Get add-on info in local manifest file 30/278730/6
authorliwei <wei90727.li@samsung.com>
Mon, 25 Jul 2022 11:50:05 +0000 (19:50 +0800)
committerliwei <wei90727.li@samsung.com>
Fri, 5 Aug 2022 09:06:49 +0000 (17:06 +0800)
Now app direct launch performance, get add-on using pkgmgr api, it cost
some time(depend on installed app count), so TV plan to optimize this logic,
when add-on is installed, vd-wgt-backend save mainifest.json to '/home/
owner/apps_rw/xwalk-service/addon/tizenid(***.***)/', then web app directly
launch or wrt-loader launch, we can get add-on info from these mainfest
files directly, it will only cost little time.

Change-Id: If1ee7fc1777220dd9f6ff8af3d5c007c2c24441c
Signed-off-by: liwei <wei90727.li@samsung.com>
wrt_app/src/addon_manager.ts

index 299bdce..dd8dfd9 100644 (file)
@@ -39,6 +39,7 @@ interface AddonInfo {
 }
 
 const ADN_PATH = path.join(os.homedir(), 'data/electron/runtime_addon');
+const INSTALLED_ADN_MANIFEST_PATH = path.join(os.homedir(), 'apps_rw/xwalk-service/addon');
 const MANIFEST_FILE = 'manifest.json';
 const ADDONS_DB_FILE = 'addons_db.json';
 
@@ -159,11 +160,22 @@ class AddonManager {
     this.addonList = list;
   }
 
+  private getInstalledAddonManifest(): void {
+    if (!fs.existsSync(INSTALLED_ADN_MANIFEST_PATH))
+      return;
+    fs.readdirSync(INSTALLED_ADN_MANIFEST_PATH).forEach((file) => {
+        console.log('in xwalkservice directory, add-on : ' + file);
+        let manifestPath = path.join(os.homedir(), 'apps_rw', file, '/shared/res');
+        let pkgname = path.join(file);
+        this.checkAddon(manifestPath, pkgname);
+      });
+  }
+
   initialize(): boolean {
     wrt.on('addon-installed', (event: any, pathList: string[]) => {
       for (let path of pathList) {
         console.log('addon-installed at ' + path);
-        this.checkAddon(path);
+        this.checkAddon(path, '');
       }
       this.updateDB();
     });
@@ -172,7 +184,12 @@ class AddonManager {
       console.log('addon-unistalled named ' + id);
     });
 
-    wrt.requestAddonList();
+    if (wrt.tv) {
+      this.getInstalledAddonManifest();
+      this.updateDB();
+    } else {
+      wrt.requestAddonList();
+    }
     return this.isAddonAvailable();
   }
 
@@ -274,7 +291,7 @@ class AddonManager {
     this.eventManager.emit(eventName, ...args);
   }
 
-  private checkAddon(appPath: string) {
+  private checkAddon(appPath: string, pkgname: string) {
     let manifest;
     try {
       let manifestPath = path.join(appPath, MANIFEST_FILE);
@@ -285,11 +302,14 @@ class AddonManager {
     }
 
     let arr = appPath.split("/");
-    let index = 0;
-    for (let i in arr) {
-      if (arr[i] == 'shared') {
-        index = Number(i) - 1;
-        break;
+    if(pkgname === '') {
+      for (let i in arr) {
+        if (arr[i] == 'shared') {
+          let index = 0;
+          index = Number(i) - 1;
+          pkgname = arr[index];
+          break;
+        }
       }
     }
 
@@ -298,7 +318,7 @@ class AddonManager {
       name: manifest.name,
       isChromeExtension,
       path: isChromeExtension ? appPath : path.join(appPath, manifest.main),
-      pkgid: arr[index],
+      pkgid: pkgname,
       activate: true
     });
   }