1/* 2 * Copyright (c) 2021-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 { MediaDataManager } from '../data/MediaDataManager'; 17import { BigDataConstants, Constants as commonConstants, DataStoreUtil, Log, ReportToBigDataUtil } from '@ohos/common'; 18import formBindingData from '@ohos.application.formBindingData'; 19import { Constants } from '../common/Constants'; 20import formProvider from '@ohos.application.formProvider'; 21import type Want from '@ohos.app.ability.Want'; 22 23const TAG: string = 'formA_The_FormController'; 24 25export interface FormListener { 26 onDeleteForm(formId: string): void; 27 28 onUpdateFormData(formId: string): void; 29 30 onEvent(formId: string): void; 31 32 onCallback(formId: string): void; 33 34 onShowForm(formId: string): void; 35 36 updateFormData(formId: string, vars?: string[]): void; 37} 38 39export class FormController implements FormListener { 40 private static readonly MSG_ROUTER_PHOTOS = 'routerPhotos'; 41 mediaDataManager: MediaDataManager; 42 private formId: string; 43 private callback: Function = null; 44 private indexValue: number = 0; 45 46 constructor(formId: string, operationMode: number, callback?: Function) { 47 this.formId = formId; 48 this.callback = callback; 49 this.mediaDataManager = new MediaDataManager(operationMode, this); 50 if (operationMode === Constants.PHOTOS_FORM_OPERATION_MODE_DESTROY) { 51 this.onDeleteForm(formId); 52 } else { 53 this.mediaDataManager.initData(formId); 54 } 55 } 56 57 bindFormData(formId: string): formBindingData.FormBindingData { 58 let fd: number = this.mediaDataManager.getCurrentFd(); 59 Log.info(TAG, `bindFormData start formId: ${formId} fd:${fd}`); 60 let image: string = this.imageHashCode(fd, formId); 61 let dataObj: object = { 62 'fd': fd === -1 ? false : true, 63 'image0': 'memory://' + image, 64 'image1': 'memory://' + image, 65 'indexValue': this.indexValue, 66 'albumName': this.mediaDataManager.getCurrentAlbumName(), 67 'currentIndex': this.mediaDataManager.getCurrentIndex(), 68 'isShow': this.mediaDataManager.getIsShowAlbumName(), 69 'formImages': JSON.parse(`{ "${image}": ${fd} }`), 70 'uri': (this.mediaDataManager.getMediaData().currentUri !== '') ? 71 commonConstants.ACTION_URI_FORM_ABILITY : commonConstants.ACTION_URI_FORM_ABILITY_NONE, 72 'albumUri': `${this.mediaDataManager.getMediaData().albumUri}`, 73 'currentUri': this.mediaDataManager.getMediaData().currentUri 74 }; 75 Log.debug(TAG, `bindFormData, createFormBindingData dataObj2.data: ${JSON.stringify(dataObj)}`); 76 let obj: formBindingData.FormBindingData = formBindingData.createFormBindingData(JSON.stringify(dataObj)); 77 Log.debug(TAG, `bindFormData end, createFormBindingData obj2.data: ${JSON.stringify(obj.data)}`); 78 return obj; 79 } 80 81 imageHashCode(fd: number, formId: string) { 82 let mediaData = this.mediaDataManager.getMediaData(); 83 return 'image_' + fd + '_formId_' + formId + '_uri_' + mediaData.currentUri + '_orientation_' + mediaData.orientation; 84 } 85 86 async updateFormData(formId: string, vars: string[]) { 87 Log.debug(TAG, `updateFormData formId: ${JSON.stringify(formId)}`); 88 let dataStore = DataStoreUtil.getInstance(); 89 await dataStore.init(); 90 this.indexValue = await dataStore.getData(Constants.FA_INDEX_VALUE, 0); 91 let formObj: formBindingData.FormBindingData = this.bindFormData(formId); 92 Log.debug(TAG, `updateFormData obj: ${JSON.stringify(formObj)}`); 93 formProvider.updateForm(formId, formObj) 94 .then(() => { 95 this.onCallback(); 96 this.onDestroy(); 97 }).catch((error) => { 98 Log.error(TAG, `updateForm failed. Cause: ${JSON.stringify(error)}`); 99 let msg = { 'err': JSON.stringify(error) }; 100 ReportToBigDataUtil.errEventReport(BigDataConstants.SET_FA_CARD_IS_NAME_ERROR, msg); 101 this.mediaDataManager.closeFd(); 102 }); 103 } 104 105 onDestroy() { 106 Log.info(TAG, 'onDestroy start!'); 107 this.mediaDataManager.closeFd(); 108 this.callback = null; 109 Log.info(TAG, 'onDestroy done end!'); 110 } 111 112 async onUpdateFormData(formId: string) { 113 Log.debug(TAG, `onUpdateFormData formId: ${formId}`); 114 let dataStore = DataStoreUtil.getInstance(); 115 await dataStore.init(); 116 let temp = await dataStore.getData(Constants.FA_INDEX_VALUE, 0); 117 this.indexValue = (temp + Constants.NUMBER_1) % Constants.NUMBER_2; 118 await dataStore.putData(Constants.FA_INDEX_VALUE, this.indexValue); 119 await dataStore.flush(); 120 this.mediaDataManager.setNextIndex(); 121 } 122 123 routerPhotoBrowser() { 124 Log.debug(TAG, 'routerPhotoBrowser start!'); 125 let param: Want = { 126 'bundleName': 'com.ohos.photos', 127 'abilityName': 'com.ohos.photos.MainAbility', 128 'parameters': { 129 'uri': (this.mediaDataManager.getMediaData().currentUri !== '') ? 130 commonConstants.ACTION_URI_FORM_ABILITY : commonConstants.ACTION_URI_FORM_ABILITY_NONE, 131 'albumUri': `${this.mediaDataManager.getMediaData().albumUri}`, 132 'displayName': `${this.mediaDataManager.getMediaData().displayName}`, 133 'currentUri': this.mediaDataManager.getMediaData().currentUri 134 } 135 }; 136 Log.debug(TAG, `routerPhotoBrowser parm ${JSON.stringify(param)}`); 137 138 globalThis.formContext.startAbility(param).then(() => { 139 AppStorage.Delete(Constants.FROM_CONTROLLER_MANAGER); 140 }) 141 142 this.onDestroy(); 143 Log.debug(TAG, 'routerPhotoBrowser end!'); 144 } 145 146 onTriggerFormEvent(formId: string, message): void { 147 Log.debug(TAG, `onTriggerFormEvent ${formId} ${message}`); 148 let msgObj = JSON.parse(message); 149 let param = msgObj['params']; 150 let msg = param['message']; 151 Log.debug(TAG, `onTriggerFormEvent ${param} ${msg}`); 152 if (msg == FormController.MSG_ROUTER_PHOTOS) { 153 this.routerPhotoBrowser(); 154 } 155 } 156 157 onEvent(formId: string): void { 158 Log.debug(TAG, 'onEvent start!'); 159 if (this.callback != null) { 160 if (this.mediaDataManager.getUpdateTag()) { 161 this.mediaDataManager.setUpdateTag(false) 162 Log.debug(TAG, `updateFormData formId: ${JSON.stringify(formId)}`); 163 let formObj: formBindingData.FormBindingData = this.bindFormData(formId); 164 Log.debug(TAG, `updateFormData obj: ${JSON.stringify(formObj)}`); 165 formProvider.updateForm(formId, formObj).then(() => { 166 Log.info(TAG, 'updateFormData begin'); 167 this.onTriggerFormEvent(formId, this.callback.call(this.callback)); 168 }).catch((error) => { 169 this.onTriggerFormEvent(formId, this.callback.call(this.callback)); 170 }); 171 } else { 172 this.onTriggerFormEvent(formId, this.callback.call(this.callback)); 173 } 174 } 175 Log.debug(TAG, 'onEvent end!'); 176 } 177 178 onCallback(): void { 179 Log.debug(TAG, 'onCallback start!'); 180 if (this.callback != null) { 181 this.callback.call(this.callback); 182 } 183 Log.debug(TAG, 'onCallback end!'); 184 } 185 186 onDeleteForm(formId: string): void { 187 this.mediaDataManager.storageDelete(); 188 } 189 190 async onShowForm(formId: string) { 191 Log.info(TAG, 'onShowForm start!'); 192 ReportToBigDataUtil.report(BigDataConstants.SET_FA_CARD_IS_NAME_ID, null); 193 let isShowName = AppStorage.Get(Constants.FROM_PLAYBACK_ISSHOWNAME); 194 let isShowKey = Constants.FROM_PLAYBACK_ISSHOWNAME; 195 let dataStore = DataStoreUtil.getInstance(); 196 await dataStore.init(); 197 await dataStore.putData(isShowKey, isShowName ? 1 : 0); 198 await dataStore.flush(); 199 this.updateFormData(formId, []); 200 } 201}