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