1bea4f105Sopenharmony_ci/*
2bea4f105Sopenharmony_ci * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.
3bea4f105Sopenharmony_ci */
4bea4f105Sopenharmony_ciimport UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession';
5bea4f105Sopenharmony_ciimport { ability, wantConstant } from '@kit.AbilityKit';
6bea4f105Sopenharmony_ciimport bundleManager from '@ohos.bundle.bundleManager';
7bea4f105Sopenharmony_ciimport { DownloadDialog } from './component/dialog/DownloadDialog';
8bea4f105Sopenharmony_ciimport { StartModeOptions } from '../base/model/StartModeOptions';
9bea4f105Sopenharmony_ciimport { FilePickerUtil } from '../base/utils/FilePickerUtil';
10bea4f105Sopenharmony_ciimport Logger from '../base/log/Logger';
11bea4f105Sopenharmony_ciimport { VirtualUri } from '../base/constants/FolderRecord';
12bea4f105Sopenharmony_ciimport { FsUtil } from '../base/utils/FsUtil';
13bea4f105Sopenharmony_ciimport { FileUtil } from '../base/utils/FileUtil';
14bea4f105Sopenharmony_ciimport { BusinessError } from '@kit.BasicServicesKit';
15bea4f105Sopenharmony_ciimport uriPermissionManager from '@ohos.application.uriPermissionManager';
16bea4f105Sopenharmony_ciimport AbilityCommonUtil from '../base/utils/AbilityCommonUtil';
17bea4f105Sopenharmony_ci
18bea4f105Sopenharmony_ci
19bea4f105Sopenharmony_ciconst TAG = 'DownloadAuth';
20bea4f105Sopenharmony_ciconst DOWNLOAD_PATH = '/storage/Users/currentUser/Download';
21bea4f105Sopenharmony_cilet storage = LocalStorage.getShared();
22bea4f105Sopenharmony_ci
23bea4f105Sopenharmony_ci@Component
24bea4f105Sopenharmony_ci@Entry(storage)
25bea4f105Sopenharmony_cistruct DownloadAuth {
26bea4f105Sopenharmony_ci  private downloadNewUri: string = '';
27bea4f105Sopenharmony_ci  private startModeOptions: StartModeOptions = FilePickerUtil.getStartOptionsFromStorage();
28bea4f105Sopenharmony_ci  private session: UIExtensionContentSession = this.startModeOptions.session;
29bea4f105Sopenharmony_ci  // 存储当前从bms查询到的所有应用的bundle信息
30bea4f105Sopenharmony_ci  public bundleArray: Array<bundleManager.BundleInfo> = [];
31bea4f105Sopenharmony_ci  private appName: string | undefined = storage.get<string>('appName');
32bea4f105Sopenharmony_ci  private appIcon: string | undefined = storage.get<string>('appIcon');
33bea4f105Sopenharmony_ci  private confirm: Function = () => {
34bea4f105Sopenharmony_ci  };
35bea4f105Sopenharmony_ci  // 弹窗关联取消
36bea4f105Sopenharmony_ci  private cancel: Function = () => {
37bea4f105Sopenharmony_ci  };
38bea4f105Sopenharmony_ci
39bea4f105Sopenharmony_ci  aboutToAppear(): void {
40bea4f105Sopenharmony_ci    Logger.i(TAG, 'DownloadAuth aboutToAppear');
41bea4f105Sopenharmony_ci  }
42bea4f105Sopenharmony_ci
43bea4f105Sopenharmony_ci  onPageShow() {
44bea4f105Sopenharmony_ci    Logger.i(TAG, 'DownloadAuth onPageShow appName: ' + this.appName + ', appIcon: ' + this.appIcon);
45bea4f105Sopenharmony_ci    this.downloadDialogOpen();
46bea4f105Sopenharmony_ci  }
47bea4f105Sopenharmony_ci
48bea4f105Sopenharmony_ci  downloadDialogOpen(): void {
49bea4f105Sopenharmony_ci    this.confirm = async () => {
50bea4f105Sopenharmony_ci      this.downloadDialogConfirm();
51bea4f105Sopenharmony_ci      this.externalDownloadDialog.close();
52bea4f105Sopenharmony_ci    };
53bea4f105Sopenharmony_ci    this.cancel = () => {
54bea4f105Sopenharmony_ci      this.externalDownloadDialog.close();
55bea4f105Sopenharmony_ci      if (this.session != undefined) {
56bea4f105Sopenharmony_ci        this.session.terminateSelf();
57bea4f105Sopenharmony_ci      }
58bea4f105Sopenharmony_ci    };
59bea4f105Sopenharmony_ci    this.externalDownloadDialog.open();
60bea4f105Sopenharmony_ci  }
61bea4f105Sopenharmony_ci
62bea4f105Sopenharmony_ci  async downloadDialogConfirm(): Promise<void> {
63bea4f105Sopenharmony_ci    const bundleName: string = this.startModeOptions.callerBundleName;
64bea4f105Sopenharmony_ci    Logger.i(TAG, 'Download Dialog confirm.');
65bea4f105Sopenharmony_ci    this.downloadNewUri = VirtualUri.DOWNLOAD + '/' + bundleName;
66bea4f105Sopenharmony_ci    let isExist: boolean = FsUtil.accessSync(DOWNLOAD_PATH + '/' + bundleName);
67bea4f105Sopenharmony_ci    if (!isExist) {
68bea4f105Sopenharmony_ci      this.downloadNewUri = FileUtil.createFolderByFs(VirtualUri.DOWNLOAD, bundleName);
69bea4f105Sopenharmony_ci    }
70bea4f105Sopenharmony_ci    Logger.i(TAG, 'Download Dialog return uri is: ' + this.downloadNewUri);
71bea4f105Sopenharmony_ci    AbilityCommonUtil.grantUriPermission([this.downloadNewUri], bundleName);
72bea4f105Sopenharmony_ci    this.externalDownloadDialog.close();
73bea4f105Sopenharmony_ci    if (this.session === undefined) {
74bea4f105Sopenharmony_ci      Logger.i(TAG, `this.session is undefined`)
75bea4f105Sopenharmony_ci      return;
76bea4f105Sopenharmony_ci    }
77bea4f105Sopenharmony_ci    Logger.i(TAG, 'Download Dialog exist close.');
78bea4f105Sopenharmony_ci    let abilityResult: ability.AbilityResult = {
79bea4f105Sopenharmony_ci      resultCode: (this.downloadNewUri === undefined) ? -1 : 0,
80bea4f105Sopenharmony_ci      want: {
81bea4f105Sopenharmony_ci        parameters: {
82bea4f105Sopenharmony_ci          'downloadNewUri': this.downloadNewUri
83bea4f105Sopenharmony_ci        }
84bea4f105Sopenharmony_ci      }
85bea4f105Sopenharmony_ci    };
86bea4f105Sopenharmony_ci    this.session.terminateSelfWithResult(abilityResult, (error) => {
87bea4f105Sopenharmony_ci      Logger.i(TAG, 'terminateSelfWithResult is called = ' + error?.code);
88bea4f105Sopenharmony_ci    });
89bea4f105Sopenharmony_ci  }
90bea4f105Sopenharmony_ci
91bea4f105Sopenharmony_ci  build() {
92bea4f105Sopenharmony_ci  }
93bea4f105Sopenharmony_ci
94bea4f105Sopenharmony_ci  //外部调用下载弹窗
95bea4f105Sopenharmony_ci  externalDownloadDialog: CustomDialogController = new CustomDialogController({
96bea4f105Sopenharmony_ci    builder: DownloadDialog({
97bea4f105Sopenharmony_ci      appName: this.appName,
98bea4f105Sopenharmony_ci      appIcon: this.appIcon,
99bea4f105Sopenharmony_ci      confirm: this.confirm,
100bea4f105Sopenharmony_ci      cancel: this.cancel
101bea4f105Sopenharmony_ci    }),
102bea4f105Sopenharmony_ci    autoCancel: false,
103bea4f105Sopenharmony_ci    customStyle: true,
104bea4f105Sopenharmony_ci    alignment: DialogAlignment.Center, // 可设置dialog的对齐方式,设定显示在底部或中间等,默认为底部显示
105bea4f105Sopenharmony_ci  })
106bea4f105Sopenharmony_ci}