1/* 2 * Copyright (c) 2022 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 MediaLib from '@ohos.multimedia.mediaLibrary'; 16import { Log } from '../utils/Log'; 17import { AlbumDataItem } from '../data/AlbumDataItem'; 18import { MediaConstants } from '../constants/MediaConstants'; 19import mediaModel from '../model/MediaModel'; 20import { getAlbumDisplayName, getFetchOptions } from '../helper/MediaDataHelper'; 21import { QueryConstants } from '../constants/QueryConstants'; 22 23const TAG = "AlbumDataImpl" 24 25export class AlbumDataImpl { 26 private blackList: string[] = []; 27 private selectType: number = MediaConstants.SELECT_TYPE_ALL; 28 private deviceId: string = ''; 29 30 setBlackList(blackList: string[]) { 31 this.blackList = blackList; 32 } 33 34 setSelectType(selectType: number) { 35 this.selectType = selectType; 36 } 37 38 setDeviceId(deviceId: string) { 39 this.deviceId = deviceId; 40 } 41 42 async reloadAlbumItemData(): Promise<AlbumDataItem[]> { 43 let albumDataItems = []; 44 for (let i = 0;i < MediaConstants.ALBUM_DEFAULT_SORT_LIST.length; i++) { 45 await this.getAlbumItem(MediaConstants.ALBUM_DEFAULT_SORT_LIST[i], albumDataItems); 46 } 47 await this.getCommonAlbumItem(albumDataItems); 48 await this.getAlbumItem(MediaConstants.ALBUM_ID_RECYCLE, albumDataItems); 49 return albumDataItems; 50 } 51 52 private async getCommonAlbumItem(albumDataItems: AlbumDataItem[]): Promise<void> { 53 let fetchOption: MediaLib.MediaFetchOptions = await getFetchOptions(this.selectType, "", this.deviceId); 54 if (fetchOption == undefined) { 55 return; 56 } 57 fetchOption.selections = `(${fetchOption.selections}) and (${MediaLib.FileKey.ALBUM_NAME} <> ? and ${MediaLib.FileKey.ALBUM_NAME} <> ?)`; 58 fetchOption.selectionArgs.push('Camera', 'Screenshots'); 59 let albums: MediaLib.Album[] = await mediaModel.getAlbums(fetchOption); 60 for (let i = 0;i < albums.length; i++) { 61 let album: MediaLib.Album = albums[i]; 62 if (this.blackList.indexOf(album.albumId.toString()) >= 0) { 63 continue; 64 } 65 let fetchFileResult: MediaLib.FetchFileResult = await album.getFileAssets(); 66 try { 67 let count = fetchFileResult.getCount(); 68 if (count == 0) { 69 continue; 70 } 71 let item = new AlbumDataItem(album.albumId.toString(), count, album.albumName, this.selectType, this.deviceId); 72 item.update(await fetchFileResult.getFirstObject()); 73 albumDataItems.push(item); 74 } catch (err) { 75 Log.error(TAG, `on err: ${JSON.stringify(err)}`); 76 } finally { 77 fetchFileResult.close(); 78 } 79 } 80 } 81 82 private async getAlbumItem(id: string, albumDataItems: AlbumDataItem[]): Promise<void> { 83 if (this.blackList.indexOf(id) >= 0) { 84 Log.debug(TAG, `no need as in black list`); 85 return; 86 } 87 if (this.deviceId.length > 0 && (id != MediaConstants.ALBUM_ID_SNAPSHOT && id != MediaConstants.ALBUM_ID_CAMERA)) { 88 Log.debug(TAG, `no need`); 89 return; 90 } 91 let fetchOption: MediaLib.MediaFetchOptions = await getFetchOptions(this.selectType, id, this.deviceId); 92 if (fetchOption == undefined) { 93 Log.warn(TAG, `${id} fetchOption is undefined`); 94 return; 95 } 96 let item = await mediaModel.getAllMediaItem(id, fetchOption, false); 97 if (item.counts == 0) { 98 Log.warn(TAG, `${id} is empty`); 99 return; 100 } 101 102 let displayName = await getAlbumDisplayName(id); 103 let albumItem: AlbumDataItem = new AlbumDataItem(id, item.counts, displayName, this.selectType, this.deviceId); 104 albumItem.update(item.fileAsset); 105 albumDataItems.push(albumItem); 106 return; 107 } 108 109 async reloadAlbumListItemData(): Promise<AlbumDataItem[]> { 110 Log.info(TAG, 'reloadAlbumListItemData start'); 111 let albumDataItems = []; 112 for (let i = 0;i < MediaConstants.ALBUM_DEFAULT_SORT_LIST.length; i++) { 113 await this.getAlbumItem(MediaConstants.ALBUM_DEFAULT_SORT_LIST[i], albumDataItems); 114 } 115 await this.getCommonListAlbumItem(albumDataItems, 0, QueryConstants.ALBUM_COPY_FIRST_PAGE_QUERY_LENGTH); 116 return albumDataItems; 117 } 118 119 async reloadResetAlbumItemData(): Promise<AlbumDataItem[]> { 120 Log.info(TAG, 'reloadResetAlbumItemData start'); 121 let albumResetDataItems = []; 122 await this.loadAlbumReset(albumResetDataItems, QueryConstants.ALBUM_COPY_FIRST_PAGE_QUERY_LENGTH); 123 await this.getAlbumItem(MediaConstants.ALBUM_ID_RECYCLE, albumResetDataItems); 124 return albumResetDataItems; 125 } 126 127 private async getCommonListAlbumItem(albumDataItems: AlbumDataItem[], start: number, count: number): Promise<void> { 128 let fetchOption: MediaLib.MediaFetchOptions = await this.getLimitCountFetchOption(start, count); 129 if (fetchOption == undefined) { 130 return; 131 } 132 let albums: MediaLib.Album[] = await mediaModel.getAlbums(fetchOption); 133 await this.addAlbumDataItem(albumDataItems, albums); 134 } 135 136 private async addAlbumDataItem(albumDataItems: AlbumDataItem[], albums: MediaLib.Album[]) { 137 for (let i = 0;i < albums.length; i++) { 138 let album: MediaLib.Album = albums[i]; 139 if (this.blackList.indexOf(album.albumId.toString()) >= 0) { 140 continue; 141 } 142 let fetchFileResult: MediaLib.FetchFileResult = await album.getFileAssets(); 143 try { 144 let count = fetchFileResult.getCount(); 145 if (count == 0) { 146 continue; 147 } 148 let item = new AlbumDataItem(album.albumId.toString(), count, album.albumName, this.selectType, this.deviceId); 149 item.update(await fetchFileResult.getFirstObject()); 150 albumDataItems.push(item); 151 } catch (err) { 152 Log.error(TAG, `on err: ${JSON.stringify(err)}`); 153 } finally { 154 fetchFileResult.close(); 155 } 156 } 157 } 158 159 private async getLimitCountFetchOption(start: number, count: number): Promise<MediaLib.MediaFetchOptions> { 160 let fetchOption: MediaLib.MediaFetchOptions = await getFetchOptions(this.selectType, "", this.deviceId); 161 if (fetchOption == undefined) { 162 return; 163 } 164 fetchOption.selections = `(${fetchOption.selections}) and (${MediaLib.FileKey.ALBUM_NAME} <> ? and ${MediaLib.FileKey.ALBUM_NAME} <> ?)`; 165 fetchOption.selectionArgs.push('Camera', 'Screenshots'); 166 fetchOption.order = `bucket_id DESC LIMIT ${start},${count}`; 167 return fetchOption; 168 } 169 170 private async loadAlbumReset(albumDataItems: AlbumDataItem[], count) { 171 Log.info(TAG, `loadReset satrt`); 172 for (let i = 1;; i++) { 173 let fetchOption: MediaLib.MediaFetchOptions = await this.getLimitCountFetchOption(i * count, count); 174 if (fetchOption == undefined) { 175 return; 176 } 177 let albums: MediaLib.Album[] = await mediaModel.getAlbums(fetchOption); 178 await this.addAlbumDataItem(albumDataItems, albums); 179 //last page 180 if (albums.length < count) { 181 Log.info(TAG, `loadReset last ROUND : ${i}}`); 182 break; 183 } 184 } 185 Log.info(TAG, 'loadAlbumReset end'); 186 } 187}