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 dataStorage from '@ohos.data.storage'; 17import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility'; 18import formBindingData from '@ohos.app.form.formBindingData'; 19import formInfo from '@ohos.app.form.formInfo'; 20import formProvider from '@ohos.app.form.formProvider'; 21import Logger from '../model/Logger' 22import type Want from '@ohos.app.ability.Want'; 23 24const DATA_STORAGE_PATH = "/data/storage/el2/base/haps/form_store"; 25const FORM_PARAM_IDENTITY_KEY = "ohos.extra.param.key.form_identity"; 26const FORM_PARAM_NAME_KEY = "ohos.extra.param.key.form_name"; 27const FORM_PARAM_TEMPORARY_KEY = "ohos.extra.param.key.form_temporary"; 28 29function getTemperature(formId: string, count: number) { 30 const DECIMAL: number = 10; 31 const parsedFormId: number = parseInt(formId, DECIMAL); 32 const BASE_TEMP_MOD: number = 20; 33 const baseTemperature: number = parsedFormId % BASE_TEMP_MOD; 34 const RANGE_TEMP_MOD: number = 20; 35 return baseTemperature + Math.abs(count % RANGE_TEMP_MOD - RANGE_TEMP_MOD / 2); 36} 37 38function padZero(num: number) { 39 // trans num to string and pad 0 40 if (num < 10) { 41 return `0${num}`; 42 } else { 43 return num.toString(); 44 } 45} 46 47function getTime() { 48 const date = new Date(); 49 const hours = padZero(date.getHours()); 50 const minutes = padZero(date.getMinutes()); 51 const seconds = padZero(date.getSeconds()); 52 return `${hours}:${minutes}:${seconds}` 53} 54 55async function storeFormInfo(formId: string, formName: string, tempFlag: boolean) { 56 let formInfo = { 57 "formName": formName, 58 "tempFlag": tempFlag, 59 "updateCount": 0 60 }; 61 try { 62 const storage = await dataStorage.getStorage(DATA_STORAGE_PATH); 63 // put form info 64 await storage.put(formId, JSON.stringify(formInfo)); 65 Logger.log(`storeFormInfo, put form info successfully, formId: ${formId}`); 66 await storage.flush(); 67 } catch (err) { 68 Logger.error(`failed to storeFormInfo, err: ${JSON.stringify(err)}`); 69 } 70} 71 72async function updateTempFormInfo(formId: string) { 73 let formInfoDefault = { 74 "formName": "", 75 "tempFlag": false, 76 "updateCount": 0 77 }; 78 try { 79 const storage = await dataStorage.getStorage(DATA_STORAGE_PATH); 80 // get form info 81 const data = await storage.get(formId, JSON.stringify(formInfoDefault)); 82 Logger.log(`updateTempFormInfo, get form info successfully, formId: ${formId}`); 83 const formInfo = JSON.parse(data.toString()); 84 if (!formInfo.tempFlag) { 85 Logger.log(`updateTempFormInfo, formId: ${formId} is not temporary.`); 86 return; 87 } 88 89 formInfo.tempFlag = false; 90 // update form info 91 await storage.put(formId, JSON.stringify(formInfo)); 92 Logger.log(`updateTempFormInfo, update form info successfully, formId: ${formId}`); 93 await storage.flush(); 94 } catch (err) { 95 Logger.error(`failed to updateTempFormInfo, err: ${JSON.stringify(err)}`); 96 } 97} 98 99async function updateForm(formId: string) { 100 let formInfoDefault = { 101 "formName": "", 102 "tempFlag": false, 103 "updateCount": 0 104 }; 105 try { 106 const storage = await dataStorage.getStorage(DATA_STORAGE_PATH); 107 // get form info 108 const data = await storage.get(formId, JSON.stringify(formInfoDefault)); 109 Logger.log(`updateForm, get form info successfully, formId: ${formId}`); 110 const formInfo = JSON.parse(data.toString()); 111 formInfo.updateCount = formInfo.updateCount + 1; 112 113 let obj = { 114 "temperature": getTemperature(formId, formInfo.updateCount).toString(), 115 "time": getTime() 116 }; 117 let formData = formBindingData.createFormBindingData(obj); 118 formProvider.updateForm(formId, formData).catch((err) => { 119 Logger.error(`updateForm, err: ${JSON.stringify(err)}`); 120 }); 121 122 // update form info 123 await storage.put(formId, JSON.stringify(formInfo)); 124 Logger.log(`updateForm, update form info successfully, formId: ${formId}`); 125 await storage.flush(); 126 } catch (err) { 127 Logger.error(`failed to updateForm, err: ${JSON.stringify(err)}`); 128 } 129} 130 131async function deleteFormInfo(formId: string) { 132 try { 133 const storage = await dataStorage.getStorage(DATA_STORAGE_PATH); 134 // del form info 135 await storage.delete(formId); 136 Logger.log(`deleteFormInfo, del form info successfully, formId: ${formId}`); 137 await storage.flush(); 138 } catch (err) { 139 Logger.error(`failed to deleteFormInfo, err: ${JSON.stringify(err)}`); 140 } 141} 142 143export default class FormAbility extends FormExtensionAbility { 144 onAddForm(want: Want): formBindingData.FormBindingData { 145 Logger.log(`FormAbility onCreate, want: ${JSON.stringify(want)}`); 146 147 // get form info 148 let formId: string = want.parameters[FORM_PARAM_IDENTITY_KEY].toString(); 149 let formName: string = want.parameters[FORM_PARAM_NAME_KEY].toString(); 150 let tempFlag: boolean = Boolean(want.parameters[FORM_PARAM_TEMPORARY_KEY]); 151 storeFormInfo(formId, formName, tempFlag); 152 153 let obj = { 154 'temperature': getTemperature(formId, 0).toString(), 155 'time': getTime() 156 }; 157 let formData: formBindingData.FormBindingData = formBindingData.createFormBindingData(obj); 158 return formData; 159 } 160 161 onCastToNormalForm(formId: string): void { 162 Logger.log(`FormAbility onCastToNormal, formId: ${formId}`); 163 updateTempFormInfo(formId); 164 } 165 166 onUpdateForm(formId: string): void { 167 Logger.log(`FormAbility onUpdate, formId: ${formId}`); 168 updateForm(formId); 169 } 170 171 onChangeFormVisibility(newStatus: { [key: string]: number }): void { 172 Logger.log('FormAbility onVisibilityChange'); 173 } 174 175 onFormEvent(formId: string, message: string): void { 176 Logger.log(`FormAbility onEvent, formId = ${formId}, message: ${JSON.stringify(message)}`); 177 } 178 179 onRemoveForm(formId: string): void { 180 Logger.log(`FormAbility onDestroy, formId = ${formId}`); 181 deleteFormInfo(formId); 182 } 183 184 onAcquireFormState(want: Want): formInfo.FormState { 185 Logger.log(`FormAbility onAcquireFormState`); 186 return formInfo.FormState.READY; 187 } 188};