1/* 2 * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development 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 photoAccessHelper from '@ohos.file.photoAccessHelper'; 17import { Log } from '../utils/Log'; 18import { Constants } from '../constants/Constants'; 19import { userFileModel } from '../base/UserFileModel'; 20import { screenManager } from './ScreenManager'; 21import { MediaConstants } from '../constants/MediaConstants'; 22import { UserFileDataItem } from '../base/UserFileDataItem'; 23import { FavorUserFileDataItem } from '../base/FavorUserFileDataItem'; 24import { userFileDataItemCache } from '../base/UserFileDataItemCache'; 25import { trashUserFileDataItemCache } from '../base/TrashUserFileDataItemCache'; 26import { TrashUserFileDataItem } from '../base/TrashUserFileDataItem'; 27import dataSharePredicates from '@ohos.data.dataSharePredicates'; 28 29 30const TAG = 'GroupDataImpl'; 31 32export class GroupDataImpl { 33 private selectType: number = MediaConstants.SELECT_TYPE_ALL; 34 private albumId: string = ''; 35 private deviceId: string = ''; 36 private albumType: number = -1; 37 private albumSubType: number = -1; 38 private albumName: string = ''; 39 40 setSelectType(selectType: number): void { 41 this.selectType = selectType; 42 } 43 44 setAlbumId(id: string): void { 45 Log.info(TAG, 'setAlbumId: ' + id); 46 this.albumId = id; 47 } 48 49 setDeviceId(id: string): void { 50 Log.info(TAG, 'setDeviceId: ' + id); 51 this.deviceId = id; 52 } 53 54 setAlbumType(albumType: number): void { 55 Log.info(TAG, 'setAlbumType: ' + albumType); 56 this.albumType = albumType; 57 } 58 59 setAlbumSubtype(albumSubType: number): void { 60 Log.info(TAG, 'setAlbumSubtype: ' + albumSubType); 61 this.albumSubType = albumSubType; 62 } 63 64 setAlbumName(name: string): void { 65 Log.info(TAG, 'setAlbumName: ' + name); 66 this.albumName = name; 67 } 68 69 async reloadGroupItemData(isGrid: boolean): Promise<UserFileDataItem[]> { 70 if (isGrid) { 71 return this.reloadGridGroupItemData(); 72 } else { 73 return this.reloadBrowserGroupItemData(); 74 } 75 } 76 77 async reloadBrowserGroupItemData(): Promise<UserFileDataItem[]> { 78 Log.info(TAG, 'reloadBrowserGroupItemData'); 79 let groupDataItem: UserFileDataItem[] = []; 80 let mediaFileAssets = await this.getMediaItemFileAssets(this.albumName, this.albumType, this.albumSubType); 81 if (this.albumId === MediaConstants.ALBUM_ID_FAVOR) { 82 for (let i = 0;i < mediaFileAssets.length; i++) { 83 let favorMediaItem = new FavorUserFileDataItem('', [], i); 84 if (userFileDataItemCache.hasKey(mediaFileAssets[i].uri)) { 85 favorMediaItem.favouriteStatus = userFileDataItemCache.get(mediaFileAssets[i].uri).favouriteStatus; 86 favorMediaItem.orientation = userFileDataItemCache.get(mediaFileAssets[i].uri).orientation; 87 } 88 favorMediaItem.update(mediaFileAssets[i]); 89 groupDataItem.push(favorMediaItem); 90 } 91 } else if (this.albumId === MediaConstants.ALBUM_ID_RECYCLE) { 92 for (let i = 0;i < mediaFileAssets.length; i++) { 93 let trashMediaItem = new TrashUserFileDataItem('', [], i); 94 if (userFileDataItemCache.hasKey(mediaFileAssets[i].uri)) { 95 trashMediaItem.favouriteStatus = userFileDataItemCache.get(mediaFileAssets[i].uri).favouriteStatus; 96 trashMediaItem.orientation = userFileDataItemCache.get(mediaFileAssets[i].uri).orientation; 97 } 98 trashMediaItem.update(mediaFileAssets[i]); 99 groupDataItem.push(trashMediaItem); 100 } 101 } else { 102 for (let i = 0;i < mediaFileAssets.length; i++) { 103 let mediaItem: UserFileDataItem = new UserFileDataItem('', [], this.deviceId, i); 104 if (userFileDataItemCache.hasKey(mediaFileAssets[i].uri)) { 105 mediaItem = userFileDataItemCache.get(mediaFileAssets[i].uri); 106 } else { 107 userFileDataItemCache.set(mediaFileAssets[i].uri, mediaItem); 108 } 109 mediaItem.update(mediaFileAssets[i]); 110 groupDataItem.push(mediaItem); 111 } 112 } 113 Log.info(TAG, 'reload finish'); 114 return groupDataItem; 115 } 116 117 async reloadGridGroupItemData(): Promise<UserFileDataItem[]> { 118 Log.info(TAG, 'reloadGridGroupItemData'); 119 let groupDataItem: UserFileDataItem[] = []; 120 let mediaFileAssets = await this.getMediaItemFileAssets(this.albumName, this.albumType, this.albumSubType); 121 if (this.albumId === MediaConstants.ALBUM_ID_FAVOR) { 122 for (let i = 0;i < mediaFileAssets.length; i++) { 123 let item = new FavorUserFileDataItem('', [], i); 124 if (userFileDataItemCache.hasKey(mediaFileAssets[i].uri)) { 125 Log.info(TAG, 'hasKey'); 126 item = userFileDataItemCache.get(mediaFileAssets[i].uri); 127 } else { 128 userFileDataItemCache.set(mediaFileAssets[i].uri, item); 129 } 130 item.update(mediaFileAssets[i]); 131 groupDataItem.push(item); 132 } 133 } else if (this.albumId === MediaConstants.ALBUM_ID_RECYCLE) { 134 for (let i = 0;i < mediaFileAssets.length; i++) { 135 let item = new TrashUserFileDataItem('', [], i); 136 if (trashUserFileDataItemCache.hasKey(mediaFileAssets[i].uri)) { 137 item = trashUserFileDataItemCache.get(mediaFileAssets[i].uri); 138 } else { 139 trashUserFileDataItemCache.set(mediaFileAssets[i].uri, item); 140 } 141 item.update(mediaFileAssets[i]); 142 groupDataItem.push(item); 143 } 144 } else { 145 for (let i = 0;i < mediaFileAssets.length; i++) { 146 let item = new UserFileDataItem('', [], this.deviceId, i); 147 if (userFileDataItemCache.hasKey(mediaFileAssets[i].uri)) { 148 item = userFileDataItemCache.get(mediaFileAssets[i].uri); 149 } else { 150 userFileDataItemCache.set(mediaFileAssets[i].uri, item); 151 } 152 item.update(mediaFileAssets[i]); 153 groupDataItem.push(item); 154 } 155 } 156 Log.info(TAG, 'reload finish'); 157 return groupDataItem; 158 } 159 160 private async getMediaItemFileAssets(albumName: string, albumType: number, albumSubType: number): Promise<photoAccessHelper.PhotoAsset[]> { 161 let predicates = new dataSharePredicates.DataSharePredicates(); 162 predicates.equalTo(photoAccessHelper.AlbumKeys.ALBUM_NAME, albumName) 163 let fetchOption = { 164 fetchColumns: MediaConstants.EMPTY_FETCH_COLUMNS, 165 predicates: predicates 166 }; 167 Log.info(TAG, 'albumName:' + albumName); 168 if (albumType === MediaConstants.ALBUM_TYPE_ALL) { 169 return await userFileModel.getAllMediaItems(); 170 } else if (albumType === MediaConstants.ABSTRACT_ALBUM_TYPE_MOVING_PHOTO) { 171 return await userFileModel.getAllMovingPhotoItems(); 172 } 173 let emptyPredicates = new dataSharePredicates.DataSharePredicates(); 174 emptyPredicates.orderByDesc(photoAccessHelper.PhotoKeys.DATE_ADDED); 175 let emptyFetchOption = { 176 fetchColumns: MediaConstants.FILE_ASSET_FETCH_COLUMNS, 177 predicates: emptyPredicates 178 }; 179 return await userFileModel.getAllMediaItemsByType(albumType, albumSubType, fetchOption, emptyFetchOption); 180 } 181 182 private getCount(): number { 183 let contentWidth = screenManager.getWinWidth(); 184 let maxThumbWidth = px2vp(Constants.GRID_IMAGE_SIZE) * Constants.GRID_MAX_SIZE_RATIO; 185 let columns = Math.max(Constants.GRID_MIN_COUNT, Math.ceil((contentWidth + Constants.GRID_GUTTER) / (maxThumbWidth + Constants.GRID_GUTTER))); 186 let contentHeight = screenManager.getWinHeight() - Constants.ACTION_BAR_HEIGHT - screenManager.getNaviBarHeight(); 187 let rows = Math.ceil((contentHeight + Constants.GRID_GUTTER) / (maxThumbWidth + Constants.GRID_GUTTER)) + 4; 188 return columns * rows; 189 } 190} 191