• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2021 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 */
15import { MediaData } from './MediaData';
16import { Constants } from '../common/Constants';
17import { MediaConstants } from '@ohos/base/src/main/ets/constants/MediaConstants';
18import dataStore from '@ohos/base/src/main/ets/utils/DataStoreUtil';
19import mediaModel from '@ohos/base/src/main/ets/model/MediaModel';
20import { getResourceString } from '@ohos/base/src/main/ets/utils/ResourceUtils';
21import { getAlbumDisplayName, getFetchOptions } from '@ohos/base/src/main/ets/helper/MediaDataHelper';
22import { Log } from '@ohos/base/src/main/ets/utils/Log';
23
24const TAG = "MediaDataManager"
25
26export class MediaDataManager {
27    private mediaData: MediaData = null;
28    private formController: any = null;
29    private items: any[];
30    private hasNewChange: boolean = false;
31    private fd: number = -1;
32    private key: string = '';
33    private operationMode: number = Constants.PHOTOS_FORM_OPERATION_MODE_NONE;
34    private isNextFag: boolean = true;
35    private isUpdate: boolean = false;
36
37    constructor(formId: string, operationMode: number, formController: any) {
38        this.formController = formController;
39        this.operationMode = operationMode;
40        this.initData(formId);
41    }
42
43    async initData(formId: string) {
44        Log.info(TAG, `initData formId ${formId}`);
45        await this.storageRead(formId);
46        if (this.mediaData == null || this.mediaData == undefined) {
47            Log.info(TAG, 'initData new MediaData!');
48            this.mediaData = new MediaData(formId,
49                await getResourceString($r('app.string.album_camera')),
50                Constants.PHOTOS_FORM_CAMERA_NAME, MediaConstants.ALBUM_ID_CAMERA, '', 0,
51                Constants.PHOTOS_FORM_DEFAULT_PERIOD, 1, 0);
52        }
53        Log.info(TAG, `initData formId ${this.mediaData.formId}
54            albumName ${this.mediaData.albumName} currentIndex ${this.mediaData.currentIndex}`);
55        let displayName = await getAlbumDisplayName(this.mediaData.albumId);
56        if (displayName != null) {
57            this.mediaData.displayName = displayName;
58            Log.info(TAG, 'initData displayName' + this.mediaData.displayName)
59        }
60        await this.loadData();
61    }
62
63    async saveData() {
64        Log.debug(TAG, 'saveData');
65        this.updateMediaData();
66        if (((this.operationMode != Constants.PHOTOS_FORM_OPERATION_MODE_EVENT)
67        && (this.operationMode != Constants.PHOTOS_FORM_OPERATION_MODE_DESTROY)
68        && (this.operationMode != Constants.PHOTOS_FORM_OPERATION_MODE_UPDATE)) || this.isUpdate) {
69            try {
70                this.fd = await this.openCurrentFd();
71            } catch (error) {
72                 Log.error(TAG, `open Fd failed: ${error}`);
73            }
74        }
75        Log.debug(TAG, `saveData fd: ${this.fd}`);
76        await this.storageSet();
77        this.operationFormController();
78    }
79
80    operationFormController() {
81        Log.debug(TAG, `operFormControllerOper operationMode ${this.operationMode}`);
82        switch (this.operationMode) {
83            case Constants.PHOTOS_FORM_OPERATION_MODE_DESTROY:
84                this.operationMode = Constants.PHOTOS_FORM_OPERATION_MODE_NONE;
85                this.formController.onDeleteForm(this.mediaData.formId);
86                break;
87            case Constants.PHOTOS_FORM_OPERATION_MODE_UPDATE:
88                this.operationMode = Constants.PHOTOS_FORM_OPERATION_MODE_NONE;
89                this.formController.onUpdateFormData(this.mediaData.formId);
90                break;
91            case Constants.PHOTOS_FORM_OPERATION_MODE_EVENT:
92                this.operationMode = Constants.PHOTOS_FORM_OPERATION_MODE_NONE;
93                this.formController.onEvent(this.mediaData.formId);
94                break;
95            case Constants.PHOTOS_FORM_OPERATION_MODE_CALLBACK:
96                this.operationMode = Constants.PHOTOS_FORM_OPERATION_MODE_NONE;
97                this.formController.onCallback(this.mediaData.formId);
98                break;
99            default:
100                this.formController.updateFormData(this.mediaData.formId, []);
101                break;
102        }
103        Log.debug(TAG, 'operationFormController end!');
104    }
105
106    async storageRead(formId: string) {
107        Log.debug(TAG, 'storageRead start!');
108        let formIdKey: string = 'formId_' + formId
109        let hasFormId = await dataStore.hasData(formIdKey);
110        Log.debug(TAG, `The value of hasFormId is ${hasFormId}`)
111        if (hasFormId) {
112            let displayNameKey = 'displayName_' + formId;
113            let displayName = await dataStore.getData(displayNameKey, '') as string;
114            Log.debug(TAG, `The value of albumName is ${displayName}`);
115            let albumNameKey = 'albumName_' + formId;
116            let albumName = await dataStore.getData(albumNameKey, '') as string;
117            Log.debug(TAG, `The value of albumName is ${albumName}`);
118            let albumIdKey = 'albumId_' + formId;
119            let albumId = await dataStore.getData(albumIdKey, '') as string;
120            Log.debug(TAG, `The value of albumId is ${albumId}`);
121            let currentUriKey = 'currentUri_' + formId;
122            let currentUri = await dataStore.getData(currentUriKey, '') as string;
123            Log.debug(TAG, `The value of currentUri is ${currentUri}`);
124            let currentIndexKey = 'currentIndex_' + formId;
125            let currentIndex = await dataStore.getData(currentIndexKey, 0) as number;
126            Log.debug(TAG, `The value of currentIndex is ${currentIndex}`);
127            let intervalTimeKey = 'intervalTime_' + formId;
128            let intervalTime = await dataStore.getData(intervalTimeKey, 0) as number;
129            Log.debug(TAG, `The value of intervalTime is ${intervalTime}`);
130            let isShowKey = 'isShow_' + formId;
131            let isShow = await dataStore.getData(isShowKey, 0) as number;
132            Log.debug(TAG, `The value of isShow is ${isShow}`);
133            let arkUriKey = 'arkUri_' + formId;
134            let arkUri = await dataStore.getData(arkUriKey, 0) as number;
135            Log.debug(TAG, `The value of arkUri is ${arkUri}`);
136            if (arkUri == 0) {
137                arkUri = 1;
138            } else {
139                arkUri = 0;
140            }
141            this.mediaData = new MediaData(formId, displayName, albumName, albumId,
142                currentUri, currentIndex, intervalTime, isShow, arkUri);
143        }
144        Log.debug(TAG, 'storageRead end!');
145    }
146
147    async storageSet() {
148        Log.debug(TAG, 'storageSet start!');
149        let formIdKey = 'formId_' + this.mediaData.formId;
150        await dataStore.putData(formIdKey, this.mediaData.formId);
151        let displayNameKey = 'displayName_' + this.mediaData.formId;
152        await dataStore.putData(displayNameKey, this.mediaData.displayName);
153        let albumNameKey = 'albumName_' + this.mediaData.formId;
154        await dataStore.putData(albumNameKey, this.mediaData.albumName);
155        let albumIdKey = 'albumId_' + this.mediaData.formId;
156        await dataStore.putData(albumIdKey, this.mediaData.albumId);
157        let currentUriKey = 'currentUri_' + this.mediaData.formId;
158        await dataStore.putData(currentUriKey, this.mediaData.currentUri);
159        let currentIndexKey = 'currentIndex_' + this.mediaData.formId;
160        await dataStore.putData(currentIndexKey, this.mediaData.currentIndex);
161        let intervalTimeKey = 'intervalTime_' + this.mediaData.formId;
162        await dataStore.putData(intervalTimeKey, this.mediaData.intervalTime);
163        let isShowKey = 'isShow_' + this.mediaData.formId;
164        await dataStore.putData(isShowKey, this.mediaData.isShowAlbumName);
165        let arkUriKey = 'arkUri_' + this.mediaData.formId;
166        await dataStore.putData(arkUriKey, this.mediaData.arkUri);
167        await dataStore.flush();
168        Log.debug(TAG, 'storageSet end!');
169    }
170
171    async storageDelete() {
172        Log.debug(TAG, 'storageDelete start!');
173        let formIdKey = 'formId_' + this.mediaData.formId;
174        if (await dataStore.hasData(formIdKey)) {
175            Log.debug(TAG, 'storageDelete formId');
176            await dataStore.delData(formIdKey);
177        }
178        let displayNameKey = 'displayName_' + this.mediaData.formId;
179        if (await dataStore.hasData(displayNameKey)) {
180            Log.debug(TAG, 'storageDelete displayName');
181            await dataStore.delData(displayNameKey);
182        }
183        let albumNameKey = 'albumName_' + this.mediaData.formId;
184        if (await dataStore.hasData(albumNameKey)) {
185            Log.debug(TAG, 'storageDelete albumName');
186            await dataStore.delData(albumNameKey);
187        }
188        let albumIdKey = 'albumId_' + this.mediaData.formId;
189        if (await dataStore.hasData(albumIdKey)) {
190            Log.debug(TAG, 'storageDelete albumId');
191            await dataStore.delData(albumIdKey);
192        }
193        let currentUriKey = 'currentUri_' + this.mediaData.formId;
194        if (await dataStore.hasData(currentUriKey)) {
195            Log.debug(TAG, 'storageDelete currentUri');
196            await dataStore.delData(currentUriKey);
197        }
198        let currentIndexKey = 'currentIndex_' + this.mediaData.formId;
199        if (await dataStore.hasData(currentIndexKey)) {
200            Log.debug(TAG, 'storageDelete currentIndex');
201            await dataStore.delData(currentIndexKey);
202        }
203        let intervalTimeKey = 'intervalTime_' + this.mediaData.formId;
204        if (await dataStore.hasData(intervalTimeKey)) {
205            Log.debug(TAG, 'storageDelete intervalTime');
206            await dataStore.delData(intervalTimeKey);
207        }
208        let isShowKey = 'isShow_' + this.mediaData.formId;
209        if (await dataStore.hasData(isShowKey)) {
210            Log.debug(TAG, 'storageDelete isShowAlbumName');
211            await dataStore.delData(isShowKey);
212        }
213        let arkUriKey = 'arkUri_' + this.mediaData.formId;
214        if (await dataStore.hasData(arkUriKey)) {
215            Log.debug(TAG, 'storageDelete arkUri');
216            await dataStore.delData(arkUriKey);
217        }
218        await dataStore.flush();
219        Log.debug(TAG, 'storageDelete end!');
220    }
221
222    updateMediaData() {
223        Log.debug(TAG, 'updateMediaData start! index ${this.mediaData.currentIndex}');
224        if (this.mediaData.currentIndex == -1) {
225            this.mediaData.currentIndex = 0;
226            this.isNextFag = false;
227        } else {
228            this.isNextFag = true;
229        }
230        if (this.mediaData.currentUri != '') {
231            let isExist = false;
232            for (let i = 0; i < this.items.length; i++) {
233                let uri = this.items[i].uri;
234                if (uri == this.mediaData.currentUri) {
235                    this.mediaData.currentIndex = i;
236                    isExist = true;
237                }
238            }
239            if (!isExist) {
240                if ((this.items.length != 0) && (this.mediaData.currentIndex < this.items.length)) {
241                    this.mediaData.currentUri = this.items[this.mediaData.currentIndex].uri;
242                    this.isUpdate = true;
243                }
244                if ((this.items.length == 0) || (this.mediaData.isShowAlbumName == 0)) {
245                    this.mediaData.currentUri = '';
246                }
247            }
248        } else {
249            if ((this.items.length != 0) &&
250            (this.mediaData.currentIndex < this.items.length) &&
251            (this.mediaData.isShowAlbumName != 0)) {
252                this.mediaData.currentUri = this.items[this.mediaData.currentIndex].uri;
253            }
254        }
255        Log.debug(TAG, 'updateMediaData end!');
256    }
257
258    getUpdateTag() {
259        return this.isUpdate;
260    }
261
262    setUpdateTag(isUpdate: boolean) {
263        this.isUpdate = isUpdate;
264    }
265
266    getCurrentItem(): any {
267        if ((this.mediaData.currentIndex < this.items.length) &&
268        (this.mediaData.currentUri != '')) {
269            return this.items[this.mediaData.currentIndex];
270        } else {
271            return null;
272        }
273    }
274
275    getCurrentAlbumName(): string {
276        return this.mediaData.displayName;
277    }
278
279    getCurrentIndex(): number {
280        return this.mediaData.currentIndex;
281    }
282
283    getIsShowAlbumName(): boolean {
284        return this.mediaData.isShowAlbumName == 1 ? true : false;
285    }
286
287    getIntervalTime(): number {
288        Log.debug(TAG, `getIntervalTime time ${this.mediaData.intervalTime}`);
289        return this.mediaData.intervalTime;
290    }
291
292    setNextIndex() {
293        Log.debug(TAG, `setNextIndex start old index ${this.mediaData.currentIndex} flag ${this.isNextFag}`);
294        // this.mediaData.isShowAlbumName == false means select a photo instead of a album
295        if (this.isNextFag && this.mediaData.isShowAlbumName) {
296            let index = this.mediaData.currentIndex;
297            if ((this.items.length != 0) && (index < this.items.length - 1)) {
298                index = index + 1;
299            } else {
300                index = 0;
301            }
302            this.mediaData.currentIndex = index;
303            if (this.items.length >= 1) {
304                this.mediaData.currentUri = this.items[index].uri;
305            } else {
306                this.mediaData.currentUri = '';
307            }
308        }
309        Log.debug(TAG, `setNextIndex index ${this.mediaData.currentIndex} uri ${this.mediaData.currentUri}`);
310        this.saveData();
311        Log.debug(TAG, 'setNextIndex end!');
312    }
313
314    getMediaData(): MediaData {
315        return this.mediaData;
316    }
317
318    async openCurrentFd(): Promise<number> {
319        let fileAsset = this.getCurrentItem();
320        Log.info(TAG, `openCurrentFd uri: ${this.mediaData.currentUri}`);
321        let fd = (fileAsset != null) ? await  mediaModel.openAsset('R', fileAsset) : -1;
322         Log.info(TAG, `openCurrentFd the fd: ${fd}`);
323        return fd;
324    }
325
326    getCurrentFd(): number {
327        return this.fd;
328    }
329
330    async closeFd() {
331         Log.info(TAG, `close the fd: ${this.fd}`);
332        let fileAsset = this.getCurrentItem();
333        if (fileAsset != null && this.fd != -1) {
334            await mediaModel.closeAsset(this.fd, fileAsset);
335            this.fd = -1;
336        }
337    }
338
339    async loadData() {
340        Log.debug(TAG, 'loadData start!');
341        this.items = await this.getItems(this.mediaData.albumId);
342        if (this.items == null) {
343            this.items = [];
344        }
345         Log.info(TAG, `get album objects: Name:${this.mediaData.albumName} length: ${this.items.length}`);
346        await this.saveData();
347        Log.debug(TAG, 'loadData end!');
348    }
349
350    async getItems(albumId: string) {
351         Log.info(TAG, 'getItems start!');
352        let fetchOpt = await getFetchOptions(MediaConstants.SELECT_TYPE_IMAGE, albumId, "")
353        if (albumId == MediaConstants.ALBUM_ID_FAVOR) {
354            return await mediaModel.getAllFavorMediaItems(fetchOpt)
355        } else {
356            return await mediaModel.getAllMediaItems(fetchOpt)
357        }
358    }
359}