1/* 2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import type Base from '@ohos.base'; 17import type common from '@ohos.app.ability.common'; 18import dataPreferences from '@ohos.data.preferences'; 19import formBindingData from '@ohos.app.form.formBindingData'; 20import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility'; 21import formInfo from '@ohos.app.form.formInfo'; 22import formProvider from '@ohos.app.form.formProvider'; 23import hilog from '@ohos.hilog'; 24import type Want from '@ohos.app.ability.Want'; 25import { Configuration } from '@ohos.app.ability.Configuration'; 26 27const TAG: string = 'JsCardFormAbility'; 28const DATA_STORAGE_PATH: string = '/data/storage/el2/base/haps/form_store'; 29const DOMAIN_NUMBER: number = 0xFF00; 30 31let storeFormInfo = async (formId: string, formName: string, tempFlag: boolean, context: common.FormExtensionContext): Promise<void> => { 32 // 此处仅对卡片ID:formId,卡片名:formName和是否为临时卡片:tempFlag进行了持久化 33 let formInfo: Record<string, string | boolean | number> = { 34 formName: formName, 35 tempFlag: tempFlag, 36 updateCount: 0 37 }; 38 try { 39 const storage: dataPreferences.Preferences = await dataPreferences.getPreferences(context, DATA_STORAGE_PATH); 40 // put form info 41 await storage.put(formId, JSON.stringify(formInfo)); 42 hilog.info(DOMAIN_NUMBER, TAG, `[EntryFormAbility] storeFormInfo, put form info successfully, formId: ${formId}`); 43 await storage.flush(); 44 } catch (err) { 45 hilog.error(DOMAIN_NUMBER, TAG, `[EntryFormAbility] failed to storeFormInfo, err: ${JSON.stringify(err as Base.BusinessError)}`); 46 }; 47}; 48 49let deleteFormInfo = async (formId: string, context: common.FormExtensionContext): Promise<void> => { 50 try { 51 const storage: dataPreferences.Preferences = await dataPreferences.getPreferences(context, DATA_STORAGE_PATH); 52 // del form info 53 await storage.delete(formId); 54 hilog.info(DOMAIN_NUMBER, TAG, `[EntryFormAbility] deleteFormInfo, del form info successfully, formId: ${formId}`); 55 await storage.flush(); 56 } catch (err) { 57 hilog.error(DOMAIN_NUMBER, TAG, `[EntryFormAbility] failed to deleteFormInfo, err: ${JSON.stringify(err as Base.BusinessError)}`); 58 }; 59}; 60 61export default class JsCardFormAbility extends FormExtensionAbility { 62 onAddForm(want: Want): formBindingData.FormBindingData { 63 hilog.info(DOMAIN_NUMBER, TAG, '[JsCardFormAbility] onAddForm'); 64 65 if (want.parameters) { 66 let formId = JSON.stringify(want.parameters['ohos.extra.param.key.form_identity']); 67 let formName = JSON.stringify(want.parameters['ohos.extra.param.key.form_name']); 68 let tempFlag = want.parameters['ohos.extra.param.key.form_temporary'] as boolean; 69 // 将创建的卡片信息持久化,以便在下次获取/更新该卡片实例时进行使用 70 // 此接口请根据实际情况实现,具体请参考:FormExtAbility Stage模型卡片实例 71 storeFormInfo(formId, formName, tempFlag, this.context); 72 } 73 74 // 使用方创建卡片时触发,提供方需要返回卡片数据绑定类 75 let obj: Record<string, string> = { 76 title: 'titleOnCreate', 77 detail: 'detailOnCreate' 78 }; 79 let formData: formBindingData.FormBindingData = formBindingData.createFormBindingData(obj); 80 return formData; 81 } 82 83 onCastToNormalForm(formId: string): void { 84 // 使用方将临时卡片转换为常态卡片触发,提供方需要做相应的处理 85 hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onCastToNormalForm'); 86 } 87 88 onUpdateForm(formId: string): void { 89 // 若卡片支持定时更新/定点更新/卡片使用方主动请求更新功能,则提供方需要重写该方法以支持数据更新 90 hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onUpdateForm'); 91 let obj: Record<string, string> = { 92 title: 'titleOnUpdate', 93 detail: 'detailOnUpdate' 94 }; 95 let formData: formBindingData.FormBindingData = formBindingData.createFormBindingData(obj); 96 formProvider.updateForm(formId, formData).catch((error: Base.BusinessError) => { 97 hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] updateForm, error:' + JSON.stringify(error)); 98 }); 99 } 100 101 onChangeFormVisibility(newStatus: Record<string, number>): void { 102 // 使用方发起可见或者不可见通知触发,提供方需要做相应的处理,仅系统应用生效 103 hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onChangeFormVisibility'); 104 } 105 106 onFormEvent(formId: string, message: string): void { 107 // 若卡片支持触发事件,则需要重写该方法并实现对事件的触发 108 hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onFormEvent'); 109 // 获取message事件中传递的detail参数 110 let msg: Record<string, string> = JSON.parse(message); 111 if (msg.detail === 'message detail') { 112 // do something 113 hilog.info(DOMAIN_NUMBER, TAG, 'message info:' + msg.detail); 114 } 115 } 116 117 onRemoveForm(formId: string): void { 118 // 删除卡片实例数据 119 hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onRemoveForm'); 120 // 删除之前持久化的卡片实例数据 121 // 此接口请根据实际情况实现,具体请参考:FormExtAbility Stage模型卡片实例 122 deleteFormInfo(formId, this.context); 123 } 124 125 onConfigurationUpdate(config: Configuration) { 126 // 当前formExtensionAbility存活时更新系统配置信息时触发的回调。 127 // 需注意:formExtensionAbility创建后5秒内无操作将会被清理。 128 hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onConfigurationUpdate:' + JSON.stringify(config)); 129 } 130 131 onAcquireFormState(want: Want) { 132 // 卡片提供方接收查询卡片状态通知接口,默认返回卡片初始状态。 133 return formInfo.FormState.READY; 134 } 135}