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