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