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};