• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}