1e75ebbc8Sopenharmony_ci/*
2e75ebbc8Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3e75ebbc8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e75ebbc8Sopenharmony_ci * you may not use this file except in compliance with the License.
5e75ebbc8Sopenharmony_ci * You may obtain a copy of the License at
6e75ebbc8Sopenharmony_ci *
7e75ebbc8Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e75ebbc8Sopenharmony_ci *
9e75ebbc8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e75ebbc8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e75ebbc8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e75ebbc8Sopenharmony_ci * See the License for the specific language governing permissions and
13e75ebbc8Sopenharmony_ci * limitations under the License.
14e75ebbc8Sopenharmony_ci */
15e75ebbc8Sopenharmony_ci
16e75ebbc8Sopenharmony_ciimport worker from '@ohos.worker';
17e75ebbc8Sopenharmony_ciimport Log from '../default/Log';
18e75ebbc8Sopenharmony_ciimport BundleManager from '../default/abilitymanager/bundleManager';
19e75ebbc8Sopenharmony_ciimport { Want } from 'ability/want';
20e75ebbc8Sopenharmony_ciimport Constants, { ItemComponentData, obtainMsg, RootConfigInfo } from './common/Constants';
21e75ebbc8Sopenharmony_ciimport ServiceExtensionContext from 'application/ServiceExtensionContext';
22e75ebbc8Sopenharmony_ciimport PluginSourceLoaderPatch from './sourceloader/PluginSourceLoaderPatch'
23e75ebbc8Sopenharmony_ci
24e75ebbc8Sopenharmony_ciexport interface PluginWorkerListener {
25e75ebbc8Sopenharmony_ci  initFinish(): void;
26e75ebbc8Sopenharmony_ci  onItemAdd(data: ItemComponentData): void;
27e75ebbc8Sopenharmony_ci  onItemRemove(data: ItemComponentData): void;
28e75ebbc8Sopenharmony_ci};
29e75ebbc8Sopenharmony_ci
30e75ebbc8Sopenharmony_ciconst TAG = 'PluginDataSourceAdapter';
31e75ebbc8Sopenharmony_ci
32e75ebbc8Sopenharmony_ciexport default class PluginDataSourceAdapter {
33e75ebbc8Sopenharmony_ci  mContext: ServiceExtensionContext;
34e75ebbc8Sopenharmony_ci  mWorker;
35e75ebbc8Sopenharmony_ci  mName: string;
36e75ebbc8Sopenharmony_ci  mListener: PluginWorkerListener;
37e75ebbc8Sopenharmony_ci  mWant: Want;
38e75ebbc8Sopenharmony_ci  mPluginSourceLoaderPatch: PluginSourceLoaderPatch;
39e75ebbc8Sopenharmony_ci  mModuleName: string;
40e75ebbc8Sopenharmony_ci
41e75ebbc8Sopenharmony_ci  constructor(name: string, context: ServiceExtensionContext, listener: PluginWorkerListener, moduleName: string) {
42e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `constructor, name: ${name}`);
43e75ebbc8Sopenharmony_ci    this.mName = name;
44e75ebbc8Sopenharmony_ci    this.mContext = context;
45e75ebbc8Sopenharmony_ci    this.mListener = listener;
46e75ebbc8Sopenharmony_ci    this.mModuleName = moduleName;
47e75ebbc8Sopenharmony_ci    const WORKER_JS_URL = this.mModuleName + '/ets/workers/PluginDataSourceWorker.js';
48e75ebbc8Sopenharmony_ci    this.mWorker = new worker.Worker(WORKER_JS_URL, {
49e75ebbc8Sopenharmony_ci      type: 'classic',
50e75ebbc8Sopenharmony_ci      name: this.mName,
51e75ebbc8Sopenharmony_ci    });
52e75ebbc8Sopenharmony_ci
53e75ebbc8Sopenharmony_ci    this.mWorker.onmessage = this.onMessage.bind(this);
54e75ebbc8Sopenharmony_ci    this.mWorker.onmessageerror = this.onMessageError.bind(this);
55e75ebbc8Sopenharmony_ci    this.mWorker.onexit = this.onExit.bind(this);
56e75ebbc8Sopenharmony_ci    this.mWorker.onerror = this.onError.bind(this);
57e75ebbc8Sopenharmony_ci  }
58e75ebbc8Sopenharmony_ci
59e75ebbc8Sopenharmony_ci  setWant(want: Want): void{
60e75ebbc8Sopenharmony_ci    this.mWant = want;
61e75ebbc8Sopenharmony_ci  }
62e75ebbc8Sopenharmony_ci
63e75ebbc8Sopenharmony_ci  initDataSource(configs: RootConfigInfo): void {
64e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `name: ${this.mName}, initDataSource, configs: ${JSON.stringify(configs)}`);
65e75ebbc8Sopenharmony_ci    this.mWorker.postMessage(obtainMsg(Constants.INIT_CONFIG, configs));
66e75ebbc8Sopenharmony_ci    if (configs.loaderConfig.PluginSourceLoader) {
67e75ebbc8Sopenharmony_ci      this.mPluginSourceLoaderPatch = new PluginSourceLoaderPatch(this.mWant, this);
68e75ebbc8Sopenharmony_ci    }
69e75ebbc8Sopenharmony_ci  }
70e75ebbc8Sopenharmony_ci
71e75ebbc8Sopenharmony_ci  loadData(userId: number): void {
72e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `name: ${this.mName}, loadData`);
73e75ebbc8Sopenharmony_ci    this.mWorker.postMessage(obtainMsg(Constants.LOAD_DATA, userId));
74e75ebbc8Sopenharmony_ci  }
75e75ebbc8Sopenharmony_ci
76e75ebbc8Sopenharmony_ci  clearAll(): void {
77e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `name: ${this.mName}, clearAll`);
78e75ebbc8Sopenharmony_ci    this.mWorker.postMessage(obtainMsg(Constants.CLEAR_ALL, {}));
79e75ebbc8Sopenharmony_ci    this.mPluginSourceLoaderPatch?.clearAll();
80e75ebbc8Sopenharmony_ci  }
81e75ebbc8Sopenharmony_ci
82e75ebbc8Sopenharmony_ci  onMessage(msg: { data }): void {
83e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `name: ${this.mName}, onMessage, msg: ${JSON.stringify(msg)}`);
84e75ebbc8Sopenharmony_ci    let data = msg.data;
85e75ebbc8Sopenharmony_ci    switch (data.action) {
86e75ebbc8Sopenharmony_ci      case Constants.INIT_FINISH:
87e75ebbc8Sopenharmony_ci        this.onInitFinish();
88e75ebbc8Sopenharmony_ci        break;
89e75ebbc8Sopenharmony_ci      case Constants.ADD_ITEM:
90e75ebbc8Sopenharmony_ci        this.onItemAdd(data.data);
91e75ebbc8Sopenharmony_ci        break;
92e75ebbc8Sopenharmony_ci      case Constants.REMOVE_ITEM:
93e75ebbc8Sopenharmony_ci        this.onItemRemove(data.data);
94e75ebbc8Sopenharmony_ci        break;
95e75ebbc8Sopenharmony_ci      case Constants.LOAD_PLUGIN_COMPONENT_DATA:
96e75ebbc8Sopenharmony_ci        this.onLoadPluginComponentData(data.data).then(() => {
97e75ebbc8Sopenharmony_ci        }).catch(err => {
98e75ebbc8Sopenharmony_ci        });
99e75ebbc8Sopenharmony_ci        break;
100e75ebbc8Sopenharmony_ci      default:
101e75ebbc8Sopenharmony_ci        Log.showError(TAG, `name: ${this.mName}, unknown type: ${data.action}`);
102e75ebbc8Sopenharmony_ci    }
103e75ebbc8Sopenharmony_ci  }
104e75ebbc8Sopenharmony_ci
105e75ebbc8Sopenharmony_ci  onInitFinish(): void {
106e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `name: ${this.mName}, onInitFinish`);
107e75ebbc8Sopenharmony_ci    this.mListener.initFinish();
108e75ebbc8Sopenharmony_ci  }
109e75ebbc8Sopenharmony_ci
110e75ebbc8Sopenharmony_ci  async onItemAdd(itemData: ItemComponentData): Promise<void> {
111e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `name: ${this.mName}, onItemAdd, itemData: ${JSON.stringify(itemData)}`);
112e75ebbc8Sopenharmony_ci    itemData.label && (itemData.label = decodeURIComponent(itemData.label));
113e75ebbc8Sopenharmony_ci    if (itemData.label && itemData.iconUrl) {
114e75ebbc8Sopenharmony_ci      this.mListener.onItemAdd(itemData);
115e75ebbc8Sopenharmony_ci      return;
116e75ebbc8Sopenharmony_ci    }
117e75ebbc8Sopenharmony_ci    Promise.all([
118e75ebbc8Sopenharmony_ci      itemData.iconUrl ?? BundleManager.getMediaBase64({bundleName: itemData.bundleName, moduleName: itemData.moduleName, id: itemData.abilityIconId}),
119e75ebbc8Sopenharmony_ci      itemData.label ?? BundleManager.getString({bundleName: itemData.bundleName, moduleName: itemData.moduleName, id: itemData.abilityLabelId}),
120e75ebbc8Sopenharmony_ci    ])
121e75ebbc8Sopenharmony_ci      .then(([iconValue, labelValue]) => {
122e75ebbc8Sopenharmony_ci        iconValue && (itemData.iconUrl = iconValue);
123e75ebbc8Sopenharmony_ci        labelValue && (itemData.label = labelValue);
124e75ebbc8Sopenharmony_ci        this.mListener.onItemAdd(itemData);
125e75ebbc8Sopenharmony_ci      })
126e75ebbc8Sopenharmony_ci      .catch((err) => Log.showError(TAG, `name: ${this.mName}, Can't get bundle info, err: ${JSON.stringify(err)}`));
127e75ebbc8Sopenharmony_ci  }
128e75ebbc8Sopenharmony_ci
129e75ebbc8Sopenharmony_ci  onItemRemove(itemData: ItemComponentData): void {
130e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `name: ${this.mName}, onItemRemove, itemData: ${JSON.stringify(itemData)}`);
131e75ebbc8Sopenharmony_ci    this.mListener.onItemRemove(itemData);
132e75ebbc8Sopenharmony_ci  }
133e75ebbc8Sopenharmony_ci
134e75ebbc8Sopenharmony_ci  async onLoadPluginComponentData(itemData: ItemComponentData): Promise<void> {
135e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `name: ${this.mName}, onLoadPluginComponentData, itemData: ${JSON.stringify(itemData)}`);
136e75ebbc8Sopenharmony_ci    let ret = await this.mPluginSourceLoaderPatch?.requestPluginComponentData(itemData);
137e75ebbc8Sopenharmony_ci    this.mWorker.postMessage(obtainMsg(Constants.UPDATE_PLUGIN_COMPONENT_DATA, ret));
138e75ebbc8Sopenharmony_ci  }
139e75ebbc8Sopenharmony_ci
140e75ebbc8Sopenharmony_ci  async onUpdatePluginComponentData(pluginComponentData: ItemComponentData): Promise<void> {
141e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `name: ${this.mName}, onUpdatePluginComponentData, pluginComponentData: ${JSON.stringify(pluginComponentData)}`);
142e75ebbc8Sopenharmony_ci    this.mWorker.postMessage(obtainMsg(Constants.UPDATE_PLUGIN_COMPONENT_DATA, pluginComponentData));
143e75ebbc8Sopenharmony_ci  }
144e75ebbc8Sopenharmony_ci
145e75ebbc8Sopenharmony_ci  onMessageError(event): void {
146e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `name: ${this.mName}, mWorker.onmessageerror, event: ${JSON.stringify(event)}`);
147e75ebbc8Sopenharmony_ci  }
148e75ebbc8Sopenharmony_ci
149e75ebbc8Sopenharmony_ci  onExit(code: number): void {
150e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `name: ${this.mName}, mWorker.onexit, code: ${code}`);
151e75ebbc8Sopenharmony_ci  }
152e75ebbc8Sopenharmony_ci
153e75ebbc8Sopenharmony_ci  onError(err): void {
154e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `name: ${this.mName}, mWorker.onerror, err: ${JSON.stringify(err)}`);
155e75ebbc8Sopenharmony_ci  }
156e75ebbc8Sopenharmony_ci}
157