16e80583aSopenharmony_ci/** 26e80583aSopenharmony_ci * Copyright (c) 2023-2023 Huawei Device Co., Ltd. 36e80583aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 46e80583aSopenharmony_ci * you may not use this file except in compliance with the License. 56e80583aSopenharmony_ci * You may obtain a copy of the License at 66e80583aSopenharmony_ci * 76e80583aSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 86e80583aSopenharmony_ci * 96e80583aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 106e80583aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 116e80583aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 126e80583aSopenharmony_ci * See the License for the specific language governing permissions and 136e80583aSopenharmony_ci * limitations under the License. 146e80583aSopenharmony_ci */ 156e80583aSopenharmony_ci 166e80583aSopenharmony_ciimport bundleManager from '@ohos.bundle.bundleManager'; 176e80583aSopenharmony_ciimport { AppItemInfo } from '../bean/AppItemInfo'; 186e80583aSopenharmony_ciimport { CheckEmptyUtils } from '../utils/CheckEmptyUtils'; 196e80583aSopenharmony_ciimport { ResourceManager } from './ResourceManager'; 206e80583aSopenharmony_ciimport commonBundleManager from './CommonBundleManager'; 216e80583aSopenharmony_ciimport { Log } from '../utils/Log'; 226e80583aSopenharmony_ci 236e80583aSopenharmony_ciconst TAG = 'AtomicServiceAbilityManager'; 246e80583aSopenharmony_ci 256e80583aSopenharmony_ci/** 266e80583aSopenharmony_ci * 原服务管理 276e80583aSopenharmony_ci */ 286e80583aSopenharmony_ciclass AtomicServiceAbilityManager { 296e80583aSopenharmony_ci private readonly mAtomicServiceAppMap = new Map<string, AppItemInfo>(); 306e80583aSopenharmony_ci private static mInstance: AtomicServiceAbilityManager; 316e80583aSopenharmony_ci 326e80583aSopenharmony_ci /** 336e80583aSopenharmony_ci * 获取桌面应用信息管理对象 346e80583aSopenharmony_ci * 356e80583aSopenharmony_ci * @return 桌面应用信息管理对象单一实例 366e80583aSopenharmony_ci */ 376e80583aSopenharmony_ci static getInstance(): AtomicServiceAbilityManager { 386e80583aSopenharmony_ci if (AtomicServiceAbilityManager.mInstance == null) { 396e80583aSopenharmony_ci AtomicServiceAbilityManager.mInstance = new AtomicServiceAbilityManager(); 406e80583aSopenharmony_ci globalThis.AtomicServiceAbilityManagerInstance = AtomicServiceAbilityManager.mInstance; 416e80583aSopenharmony_ci } 426e80583aSopenharmony_ci Log.showInfo(TAG, 'getInstance!'); 436e80583aSopenharmony_ci return AtomicServiceAbilityManager.mInstance; 446e80583aSopenharmony_ci } 456e80583aSopenharmony_ci 466e80583aSopenharmony_ci private constructor() { 476e80583aSopenharmony_ci } 486e80583aSopenharmony_ci 496e80583aSopenharmony_ci /** 506e80583aSopenharmony_ci * 获取userId. 516e80583aSopenharmony_ci */ 526e80583aSopenharmony_ci getUserId(): number { 536e80583aSopenharmony_ci return commonBundleManager.getUserId(); 546e80583aSopenharmony_ci } 556e80583aSopenharmony_ci 566e80583aSopenharmony_ci /** 576e80583aSopenharmony_ci * 从包管理获取所有的原服务应用信息 586e80583aSopenharmony_ci * 596e80583aSopenharmony_ci * @returns 所有的原服务应用信息 606e80583aSopenharmony_ci */ 616e80583aSopenharmony_ci async getAtomicServiceAbilityList(): Promise<AppItemInfo[]> { 626e80583aSopenharmony_ci let abilityList: Array<bundleManager.AbilityInfo> = await commonBundleManager.getAllAbilityList(bundleManager.BundleType.ATOMIC_SERVICE); 636e80583aSopenharmony_ci let appItemInfoList: AppItemInfo[] = []; 646e80583aSopenharmony_ci if (CheckEmptyUtils.isEmptyArr(abilityList)) { 656e80583aSopenharmony_ci return appItemInfoList; 666e80583aSopenharmony_ci } 676e80583aSopenharmony_ci for (let i = 0; i < abilityList.length; i++) { 686e80583aSopenharmony_ci let appItem: AppItemInfo = await this.convertAtomicServiceToAppItemInfo(abilityList[i]); 696e80583aSopenharmony_ci if (!CheckEmptyUtils.isEmpty(appItem)) { 706e80583aSopenharmony_ci appItemInfoList.push(appItem); 716e80583aSopenharmony_ci } 726e80583aSopenharmony_ci } 736e80583aSopenharmony_ci return appItemInfoList; 746e80583aSopenharmony_ci } 756e80583aSopenharmony_ci 766e80583aSopenharmony_ci /** 776e80583aSopenharmony_ci * 从包管理获取应用信息 786e80583aSopenharmony_ci * 796e80583aSopenharmony_ci * @param bundleName 包名 806e80583aSopenharmony_ci * @returns 应用信息 816e80583aSopenharmony_ci */ 826e80583aSopenharmony_ci async getAtomicServiceAbilityInfoAsync(bundleName: string): Promise<AppItemInfo[]> { 836e80583aSopenharmony_ci if (CheckEmptyUtils.checkStrIsEmpty(bundleName)) { 846e80583aSopenharmony_ci Log.showError(TAG, 'getAtomicServiceAbilityInfoAsync reqParam bundleName is empty'); 856e80583aSopenharmony_ci return []; 866e80583aSopenharmony_ci } 876e80583aSopenharmony_ci let bundleInfo: bundleManager.BundleInfo = await commonBundleManager.getBundleInfoByBundleName(bundleName, bundleManager.BundleType.ATOMIC_SERVICE); 886e80583aSopenharmony_ci if (CheckEmptyUtils.isEmpty(bundleInfo)) { 896e80583aSopenharmony_ci Log.showInfo(TAG, `getAtomicServiceAbilityInfoAsync by bundleName:${bundleName} no result from MGR`); 906e80583aSopenharmony_ci return []; 916e80583aSopenharmony_ci } 926e80583aSopenharmony_ci let appItemInfoList :AppItemInfo[] = []; 936e80583aSopenharmony_ci if (CheckEmptyUtils.isEmptyArr(bundleInfo.hapModulesInfo)) { 946e80583aSopenharmony_ci return appItemInfoList; 956e80583aSopenharmony_ci } 966e80583aSopenharmony_ci for (let i = 0; i < bundleInfo.hapModulesInfo.length; i++) { 976e80583aSopenharmony_ci if (CheckEmptyUtils.isEmptyArr(bundleInfo.hapModulesInfo[i].abilitiesInfo)) { 986e80583aSopenharmony_ci continue; 996e80583aSopenharmony_ci } 1006e80583aSopenharmony_ci for (let j = 0; j < bundleInfo.hapModulesInfo[i].abilitiesInfo.length; j++) { 1016e80583aSopenharmony_ci let appItem: AppItemInfo = await this.convertAtomicServiceToAppItemInfo(bundleInfo.hapModulesInfo[i].abilitiesInfo[j], bundleInfo.appInfo); 1026e80583aSopenharmony_ci if (!CheckEmptyUtils.isEmpty(appItem)) { 1036e80583aSopenharmony_ci appItemInfoList.push(appItem); 1046e80583aSopenharmony_ci } 1056e80583aSopenharmony_ci } 1066e80583aSopenharmony_ci } 1076e80583aSopenharmony_ci return appItemInfoList; 1086e80583aSopenharmony_ci } 1096e80583aSopenharmony_ci 1106e80583aSopenharmony_ci /** 1116e80583aSopenharmony_ci * 从缓存中获取或包管理获取原服务ability信息 1126e80583aSopenharmony_ci * 1136e80583aSopenharmony_ci * @param bundleName 包名 1146e80583aSopenharmony_ci * @returns 一个ability信息 1156e80583aSopenharmony_ci */ 1166e80583aSopenharmony_ci async getAnAtomicServiceAbilityInfoFromCache(bundleName: string): Promise<AppItemInfo | undefined> { 1176e80583aSopenharmony_ci let appItemInfo: AppItemInfo | undefined = undefined; 1186e80583aSopenharmony_ci if (CheckEmptyUtils.checkStrIsEmpty(bundleName)) { 1196e80583aSopenharmony_ci Log.showError(TAG, 'getAnAtomicServiceAbilityInfoFromCache reqParam bundleName is empty'); 1206e80583aSopenharmony_ci return appItemInfo; 1216e80583aSopenharmony_ci } 1226e80583aSopenharmony_ci // get from cache 1236e80583aSopenharmony_ci if (this.mAtomicServiceAppMap != null && this.mAtomicServiceAppMap.has(bundleName)) { 1246e80583aSopenharmony_ci appItemInfo = this.mAtomicServiceAppMap.get(bundleName); 1256e80583aSopenharmony_ci } 1266e80583aSopenharmony_ci if (!CheckEmptyUtils.isEmpty(appItemInfo)) { 1276e80583aSopenharmony_ci Log.showInfo(TAG, `getAnAtomicServiceAbilityInfoFromCache cache result: ${JSON.stringify(appItemInfo)}`); 1286e80583aSopenharmony_ci return appItemInfo; 1296e80583aSopenharmony_ci } 1306e80583aSopenharmony_ci // get from mgr 1316e80583aSopenharmony_ci let abilityList: AppItemInfo[] = await this.getAtomicServiceAbilityInfoAsync(bundleName); 1326e80583aSopenharmony_ci if (CheckEmptyUtils.isEmptyArr(abilityList)) { 1336e80583aSopenharmony_ci Log.showInfo(TAG, `${bundleName} has no atomic ability`); 1346e80583aSopenharmony_ci return undefined; 1356e80583aSopenharmony_ci } 1366e80583aSopenharmony_ci Log.showInfo(TAG, `getAnAtomicServiceAbilityInfoFromCache from MGR: ${JSON.stringify(abilityList[0])}`); 1376e80583aSopenharmony_ci return abilityList[0]; 1386e80583aSopenharmony_ci } 1396e80583aSopenharmony_ci 1406e80583aSopenharmony_ci private async convertAtomicServiceToAppItemInfo(info: bundleManager.AbilityInfo, 1416e80583aSopenharmony_ci applicationInfo?: bundleManager.ApplicationInfo): Promise<AppItemInfo | undefined> { 1426e80583aSopenharmony_ci if (CheckEmptyUtils.isEmpty(info)) { 1436e80583aSopenharmony_ci Log.showError(TAG, 'convertAtomicServiceToAppItemInfo reqParam is empty'); 1446e80583aSopenharmony_ci return undefined; 1456e80583aSopenharmony_ci } 1466e80583aSopenharmony_ci let appInfo: bundleManager.ApplicationInfo = info.applicationInfo; 1476e80583aSopenharmony_ci if (CheckEmptyUtils.isEmpty(appInfo)) { 1486e80583aSopenharmony_ci appInfo = applicationInfo; 1496e80583aSopenharmony_ci } 1506e80583aSopenharmony_ci if (CheckEmptyUtils.isEmpty(appInfo)) { 1516e80583aSopenharmony_ci Log.showError(TAG, 'convertAtomicServiceToAppItemInfo applicationInfo is empty'); 1526e80583aSopenharmony_ci return undefined; 1536e80583aSopenharmony_ci } 1546e80583aSopenharmony_ci const appItemInfo = new AppItemInfo(); 1556e80583aSopenharmony_ci appItemInfo.appName = await ResourceManager.getInstance().getAppNameSync( 1566e80583aSopenharmony_ci appInfo.labelId, info.bundleName, info.moduleName, appInfo.label 1576e80583aSopenharmony_ci ); 1586e80583aSopenharmony_ci appItemInfo.isSystemApp = appInfo.systemApp; 1596e80583aSopenharmony_ci appItemInfo.isUninstallAble = appInfo.removable; 1606e80583aSopenharmony_ci appItemInfo.appIconId = appInfo.iconId; 1616e80583aSopenharmony_ci appItemInfo.appLabelId = appInfo.labelId; 1626e80583aSopenharmony_ci appItemInfo.bundleName = info.bundleName; 1636e80583aSopenharmony_ci appItemInfo.abilityName = info.name; 1646e80583aSopenharmony_ci appItemInfo.moduleName = info.moduleName; 1656e80583aSopenharmony_ci appItemInfo.keyName = info.bundleName + info.name + info.moduleName; 1666e80583aSopenharmony_ci appItemInfo.bundleType = bundleManager.BundleType.ATOMIC_SERVICE; 1676e80583aSopenharmony_ci await ResourceManager.getInstance().updateIconCache(appItemInfo.appIconId, appItemInfo.bundleName, appItemInfo.moduleName); 1686e80583aSopenharmony_ci this.mAtomicServiceAppMap.set(appItemInfo.bundleName, appItemInfo); 1696e80583aSopenharmony_ci Log.showInfo(TAG, `convertAtomicServiceToAppItemInfo appItemInfo: ${JSON.stringify(appItemInfo)}`); 1706e80583aSopenharmony_ci return appItemInfo; 1716e80583aSopenharmony_ci } 1726e80583aSopenharmony_ci 1736e80583aSopenharmony_ci cleanAppMapCache(): void { 1746e80583aSopenharmony_ci this.mAtomicServiceAppMap.clear(); 1756e80583aSopenharmony_ci } 1766e80583aSopenharmony_ci} 1776e80583aSopenharmony_ci 1786e80583aSopenharmony_ciconst atomicServiceAbilityManager = AtomicServiceAbilityManager.getInstance(); 1796e80583aSopenharmony_ciexport default atomicServiceAbilityManager; 180