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}