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 { AlbumDefine } from '../AlbumDefine'; 17import { AlbumInfo } from './AlbumInfo'; 18import type { AsyncCallback } from '../../common/AsyncCallback'; 19import { BrowserDataImpl } from '../BrowserDataImpl'; 20import type { Album, FetchOptions } from '../../../access/UserFileManagerAccess'; 21import { UserFileManagerAccess } from '../../../access/UserFileManagerAccess'; 22import { Log } from '../../../utils/Log'; 23import { Constants } from '../../common/Constants'; 24import { MediaItem } from '../photo/MediaItem'; 25 26const TAG: string = 'common_AlbumDataImpl'; 27 28type AlbumInfoEx = { 29 relativePath?: string 30}; 31 32type QueryAlbumParam = { 33 filterMediaType?: string; 34 uris?: string[] 35}; 36 37export type InitAlbumParam = { 38 deviceId?: string, 39 deviceName?: string, 40 moreInfo?: boolean 41}; 42 43export type AlbumSimpleInfo = { 44 uris: string[], 45 count: number, 46 videoCount: number, 47}; 48 49export class AlbumDataImpl extends BrowserDataImpl { 50 private moreInfo: boolean = false; 51 52 constructor(param: InitAlbumParam) { 53 super(); 54 55 if (param && param.moreInfo) { 56 this.moreInfo = param.moreInfo 57 } 58 } 59 60 getDataByUri(uri: unknown) { 61 } 62 63 getData(callback: AsyncCallback<unknown>, param: QueryAlbumParam): void { 64 Log.info(TAG, 'load data getData start : ' + param); 65 if (param == null) { 66 this.buildAlbums(callback); 67 } else if (param?.filterMediaType != undefined) { 68 this.buildAlbums(callback, param.filterMediaType); 69 } else { 70 // 删除相册时,计算图片视频数量 71 this.genAlbumsInfo(callback, param.uris); 72 } 73 } 74 75 async getDataByName(name: string, albumUri?: string): Promise<Album> { 76 let albums = await UserFileManagerAccess.getInstance().getUserAlbums(AlbumDefine.getAlbumFetchOptByName(name)); 77 if (albums && albums.length > 0) { 78 let opt: FetchOptions = AlbumDefine.getFileFetchOpt(); 79 let fileResult = await albums[0].getPhotoAssets(opt); 80 if (fileResult == null || fileResult == undefined) { 81 Log.warn(TAG, `not valid fileResult`); 82 return null; 83 } 84 let count = fileResult.getCount(); 85 fileResult.close(); 86 if (count <= 0) { 87 Log.warn(TAG, `Not valid album Name: ${albums[0].albumName}, URI: ${albums[0].albumUri}`); 88 return null; 89 } 90 return albums[0]; 91 } else { 92 return null; 93 } 94 } 95 96 getDataCount(callback: AsyncCallback<unknown>, albumInfo: AlbumInfo): void { 97 } 98 99 getDataIndexByUri(callback: AsyncCallback<unknown>, param: QueryAlbumParam, uri: string): void { 100 } 101 102 getDataIndexById(callback: AsyncCallback<unknown>, param: QueryAlbumParam, id: number): void { 103 } 104 105 private async genAlbumsInfo(cb: AsyncCallback<AlbumSimpleInfo>, uris: string[]): Promise<void> { 106 Log.info(TAG, `genAlbumsInfo uris: ${JSON.stringify(uris)}`); 107 Log.info(TAG, 'load data genAlbumsInfo start'); 108 109 let res = { 110 uris: [], 111 count: 0, 112 videoCount: 0, 113 }; 114 115 for (let uri of uris) { 116 let objects = await super.getItems(uri, Constants.INVALID, Constants.INVALID); 117 Log.info(TAG, `get album objects: uri: ${uri} length: ${objects.length}`); 118 119 res.count += objects.length; 120 for (let item of objects) { 121 if (item.fileType === UserFileManagerAccess.MEDIA_TYPE_VIDEO) { 122 res.videoCount++; 123 } 124 res.uris.push(item.uri); 125 } 126 } 127 128 Log.info(TAG, `genAlbumsInfo done`); 129 cb.callback(res); 130 } 131 132 private async buildAlbums(callback: AsyncCallback<AlbumInfo[]>, filterMediaType?: string) { 133 Log.debug(TAG, `buildAlbums`); 134 let sourceData = new Array<AlbumInfo>(); 135 await this.getSystemAlbumsInfo(sourceData, filterMediaType); 136 await this.getUserAlbumsInfo(sourceData, filterMediaType); 137 await this.getTrashAlbumInfo(sourceData, filterMediaType); 138 callback.callback(sourceData); 139 } 140 141 private async getUserAlbumsInfo(albumArray: Array<AlbumInfo>, filterMediaType?: string): Promise<void> { 142 Log.debug(TAG, 'getUserAlbumsInfo'); 143 144 let albums: Album[] = await UserFileManagerAccess.getInstance().getUserAlbums(); 145 Log.debug(TAG, `getUserAlbumsInfo albums is : ${albums}`); 146 if (albums) { 147 for (let album of albums) { 148 let albumInfo: AlbumInfo = new AlbumInfo(album); 149 let albumName: string = await UserFileManagerAccess.getInstance().getAlbumName(album); 150 albumInfo.setAlbumName(albumName); 151 albumInfo.setFilterMediaType(filterMediaType); 152 // 没有相册,设置为第一张 153 if (!album.coverUri) { 154 await UserFileManagerAccess.getInstance().getAlbumFirstObject(album).then((obj) => { 155 if (obj) { 156 let mediaItem = new MediaItem(obj); 157 mediaItem.setThumbnail(this.getThumbnailSafe(obj.uri, String(obj.get(Constants.KEY_FILE_DATA)))); 158 albumInfo.setMediaItem(mediaItem); 159 albumInfo.setCoverUri(this.getThumbnailSafe(obj.uri, String(obj.get(Constants.KEY_FILE_DATA)))); 160 } 161 }); 162 } else { 163 await UserFileManagerAccess.getInstance().getFirstObject(AlbumDefine.getFileFetchOptByUri(album.coverUri)).then((obj) => { 164 if (obj) { 165 let mediaItem = new MediaItem(obj.obj); 166 mediaItem.setThumbnail(this.getThumbnailSafe(obj.obj.uri, String(obj.obj.get(Constants.KEY_FILE_DATA)))); 167 albumInfo.setMediaItem(mediaItem); 168 albumInfo.setCoverUri(this.getThumbnailSafe(obj.obj.uri, String(obj.obj.get(Constants.KEY_FILE_DATA)))); 169 } 170 }); 171 } 172 let count = await this.getItemsCount(album.albumUri); 173 albumInfo.setCount(count); // TODO album.count不为0时,在构造函数里直接获取 174 // 相册的视频数量 175 let videoCount = await this.getItemsCount(album.albumUri, AlbumDefine.FILTER_MEDIA_TYPE_VIDEO); 176 albumInfo.setVideoCount(videoCount); 177 Log.debug(TAG, `getUserAlbumsInfo albumInfo is : ${albumInfo}`); 178 albumArray.push(albumInfo); 179 Log.debug(TAG, `getUserAlbumsInfo albumArray length is : ${albumArray.length}`); 180 } 181 } else { 182 Log.error(TAG, 'Failed getUserAlbumsInfo'); 183 } 184 185 Log.debug(TAG, 'getUserAlbumsInfo done'); 186 } 187 188 189 private async getSystemAlbumsInfo(albumArray: Array<AlbumInfo>, filterMediaType?: string): Promise<void> { 190 Log.debug(TAG, 'getSystemAlbumsInfo'); 191 192 let albums: Album[] = await UserFileManagerAccess.getInstance().getSystemAlbums(); 193 Log.debug(TAG, `getSystemAlbumsInfo albums is : ${albums}`); 194 195 if (albums) { 196 for (let album of albums) { 197 Log.info(TAG, `album ${JSON.stringify(album)}`) 198 let albumInfo: AlbumInfo = new AlbumInfo(album); 199 let count = await this.getItemsCount(album.albumUri); 200 // 系统相册为空时不展示 201 if (count === 0) { 202 continue; 203 } 204 albumInfo.setCount(count); // TODO album.count不为0时,在构造函数里直接获取 205 // 相册的视频数量 206 let videoCount = await this.getItemsCount(album.albumUri, AlbumDefine.FILTER_MEDIA_TYPE_VIDEO); 207 albumInfo.setVideoCount(videoCount); 208 let albumName: string = await UserFileManagerAccess.getInstance().getAlbumName(album); 209 albumInfo.setAlbumName(albumName); 210 albumInfo.setFilterMediaType(filterMediaType); 211 if (!album.coverUri) { 212 await UserFileManagerAccess.getInstance().getAlbumFirstObject(album).then((obj) => { 213 if (obj) { 214 let mediaItem = new MediaItem(obj); 215 mediaItem.setThumbnail(this.getThumbnailSafe(obj.uri, String(obj.get(Constants.KEY_FILE_DATA)))); 216 albumInfo.setMediaItem(mediaItem); 217 albumInfo.setCoverUri(this.getThumbnailSafe(obj.uri, String(obj.get(Constants.KEY_FILE_DATA)))); 218 } 219 }); 220 } else { 221 await UserFileManagerAccess.getInstance().getFirstObject(AlbumDefine.getFileFetchOptByUri(album.coverUri)).then((obj) => { 222 if (obj) { 223 let mediaItem = new MediaItem(obj.obj); 224 mediaItem.setThumbnail(this.getThumbnailSafe(obj.obj.uri, String(obj.obj.get(Constants.KEY_FILE_DATA)))); 225 albumInfo.setMediaItem(mediaItem); 226 albumInfo.setCoverUri(this.getThumbnailSafe(obj.obj.uri, String(obj.obj.get(Constants.KEY_FILE_DATA)))); 227 } 228 }); 229 } 230 Log.debug(TAG, `getSystemAlbumsInfo albumInfo is : ${albumInfo}`); 231 albumArray.push(albumInfo); 232 Log.debug(TAG, `getSystemAlbumsInfo albumArray length is : ${albumArray.length}`); 233 } 234 } else { 235 Log.error(TAG, 'Failed getSystemAlbumsInfo'); 236 } 237 238 Log.debug(TAG, 'getSystemAlbumsInfo done'); 239 } 240 241 private async getTrashAlbumInfo(albumArray: Array<AlbumInfo>, filterMediaType?: string): Promise<void> { 242 Log.debug(TAG, 'getTrashAlbumInfo'); 243 let album: Album = await UserFileManagerAccess.getInstance().getTrashAlbum(); 244 Log.debug(TAG, `getTrashAlbumInfo albums is : ${album}`); 245 let albumInfo: AlbumInfo = new AlbumInfo(album); 246 let count = await this.getItemsCount(album.albumUri); 247 // 系统相册为空时不展示 248 if (count === 0) { 249 Log.warn(TAG, 'getTrashAlbumInfo count is 0'); 250 return; 251 } 252 albumInfo.setCount(count); 253 let albumName: string = await UserFileManagerAccess.getInstance().getAlbumName(album); 254 albumInfo.setAlbumName(albumName); 255 albumInfo.setFilterMediaType(filterMediaType); 256 Log.debug(TAG, `getTrashAlbumInfo albumArray albumInfo is : ${albumInfo}`); 257 albumArray.push(albumInfo); 258 Log.debug(TAG, `getTrashAlbumInfo albumArray length is : ${albumArray.length}`); 259 Log.debug(TAG, 'getSystemAlbumsInfo done'); 260 } 261}