• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
3 */
4
5import UIExtensionAbility from '@ohos.app.ability.UIExtensionAbility';
6import { BusinessError } from '@kit.BasicServicesKit';
7import type Want from '@ohos.app.ability.Want';
8import dataPreferences from '@ohos.data.preferences';
9import Logger from '../base/log/Logger';
10import { StartModeOptions } from '../base/model/StartModeOptions';
11import { PickerWindowType } from '../base/constants/FilePickerItems';
12import { UIExtensionContentSession } from '@kit.AbilityKit';
13import AbilityCommonUtil from '../base/utils/AbilityCommonUtil';
14import { FilePickerUtil } from '../base/utils/FilePickerUtil';
15import bundleResourceManager from '@ohos.bundle.bundleResourceManager';
16
17const TRANSPARENT_COLOR = '#00000000';
18
19const TAG: string = 'FilePickerUIExtAbility';
20
21export default class FilePickerUIExtAbility extends UIExtensionAbility {
22  private abilityKey: string = '';
23  private securityPreferences?: dataPreferences.Preferences;
24  private storage: LocalStorage = new LocalStorage();
25
26  onCreate(): void {
27    Logger.i(TAG, 'FilePickerUIExtAbility onCreate');
28  }
29
30  async onSessionCreate(want: Want, session: UIExtensionContentSession): Promise<void> {
31    Logger.i(TAG, 'FilePickerUIExtAbility onSessionCreate, want: ' + JSON.stringify(want));
32    globalThis.abilityContext = this.context;
33    let options = this.initParam(want, session);
34    this.getAppResourceInfo(options.callerBundleName, this.storage);
35    if (options.isDownloadMode()) {
36      this.initSessionDownloadAuth(session);
37      return;
38    }
39
40    this.abilityKey = `${TAG}+${Date.now()}`;
41    await AbilityCommonUtil.init();
42    if (options.isOpenFileMode()) {
43      this.initSessionFilePicker(session);
44      return;
45    }
46
47    if (options.isCreateFileMode()) {
48      this.initSessionPathPicker(session);
49      return;
50    }
51  }
52
53  onSessionDestroy(session: UIExtensionContentSession): void {
54    Logger.i(TAG, 'FilePickerUIExtAbility onSessionDestroy');
55  }
56
57  onDestroy(): void {
58    Logger.i(TAG, 'FilePickerUIExtAbility onDestroy');
59  }
60
61  private getAppResourceInfo(bundleName: string, storage: LocalStorage): void {
62    Logger.i(TAG, `getAppResourceInfo start`)
63    const bundleFlags = bundleResourceManager.ResourceFlag.GET_RESOURCE_INFO_ALL;
64    try {
65      const resourceInfo = bundleResourceManager.getBundleResourceInfo(bundleName, bundleFlags);
66      storage.setOrCreate<string>('appName', resourceInfo.label);
67      storage.setOrCreate<string>('appIcon', resourceInfo.icon);
68    } catch (err) {
69      const message = (err as BusinessError).message;
70      Logger.e(TAG, 'getBundleResourceInfo failed: %{public}s' + message);
71    }
72  }
73
74  initParam(want: Want, session: UIExtensionContentSession): StartModeOptions {
75    let options: StartModeOptions = FilePickerUtil.getStartModeOptions(want);
76    options.windowType = PickerWindowType.UI;
77    options.setUiExtContext(this.context);
78    options.context = this.context;
79    options.session = session;
80    options.fileSuffixFilters = AbilityCommonUtil.getKeyFileSuffixFilter(options.fileSuffixFilters);
81    if (options.isOpenFileMode()) {
82      options.fileSuffixFilters = AbilityCommonUtil.getKeyFileSuffixFilter(options.fileSuffixFilters);
83      options.phonePickerType = (want.parameters?.key_pick_type as string) || '';
84      options.phonePickerTypeList = AbilityCommonUtil.getKeyPickTypeList(want.parameters?.key_picker_type as object,
85        want.parameters?.key_picker_type_list as object)
86    }
87    if (options.isCreateFileMode()) {
88      options.PhoneFileSuffixChoices = AbilityCommonUtil.getKeyFileSuffixChoices(options.fileSuffixChoices);
89    }
90    this.storage.setOrCreate<StartModeOptions>('startModeOptions', options);
91    return options;
92  }
93
94  private initSessionDownloadAuth(session: UIExtensionContentSession) {
95    Logger.i(TAG, `initSessionDownloadAuth start`)
96    session.loadContent('pages/DownloadAuth', this.storage);
97    session.setWindowBackgroundColor(TRANSPARENT_COLOR);
98  }
99
100  private initSessionFilePicker(session: UIExtensionContentSession) {
101    Logger.i(TAG, `initSessionFilePicker start`)
102    try {
103      const promise = dataPreferences.getPreferences(this.context, 'securityWarning');
104      promise.then(async (object) => {
105        this.securityPreferences = object;
106        Logger.i(TAG, 'Succeeded in getting preferences.');
107        const hasSecurityWarning = this.securityPreferences.hasSync('securityWarning');
108        if (!hasSecurityWarning) {
109          await this.securityPreferences.put('securityWarning', '1');
110          await this.securityPreferences.flush();
111          this.storage?.setOrCreate('securityWarning', '1');
112          Logger.i(TAG, 'dataPreferences.flush');
113        }
114      }).catch((err: BusinessError) => {
115        console.error('Failed to get preferences. code =' + err.code + ', message =' + err.message);
116      })
117    } catch (err) {
118      console.error('Failed to get preferences. code =' + err.code + ', message =' + err.message);
119    }
120    AbilityCommonUtil.init().then(() => {
121      session.loadContent('pages/browser/storage/MyPhone', this.storage);
122      session.setWindowBackgroundColor(TRANSPARENT_COLOR);
123    });
124  }
125
126  private initSessionPathPicker(session: UIExtensionContentSession) {
127    Logger.i(TAG, `initSessionPathPicker start`)
128    AbilityCommonUtil.init().then(() => {
129      session.loadContent('pages/PathPicker', this.storage);
130      session.setWindowBackgroundColor(TRANSPARENT_COLOR);
131    });
132  }
133};