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 { Log } from '../utils/Log'; 16import { AlbumDataImpl } from '../model/AlbumDataImpl'; 17import { LazyItem, ItemDataSource } from './ItemDataSource'; 18import { AlbumDataItem } from '../data/AlbumDataItem'; 19import { MediaConstants } from '../constants/MediaConstants' 20 21const TAG = "AlbumsDataSource" 22 23export class AlbumsDataSource extends ItemDataSource { 24 private albumDataItems: AlbumDataItem[] = []; 25 private albumDataImpl: AlbumDataImpl = new AlbumDataImpl(); 26 27 setBlackList(blackList: string[]) { 28 this.albumDataImpl.setBlackList(blackList); 29 } 30 31 setSelectType(selectType: number) { 32 this.albumDataImpl.setSelectType(selectType); 33 } 34 35 setDeviceId(deviceId: string) { 36 this.albumDataImpl.setDeviceId(deviceId); 37 } 38 39 totalCount(): number { 40 return this.albumDataItems.length; 41 } 42 43 getData(index: number): LazyItem<AlbumDataItem> { 44 return new LazyItem<AlbumDataItem>(this.getDataByIndex(index), index, this.onDataUpdate.bind(this)) 45 } 46 47 getDataByIndex(index: number): AlbumDataItem { 48 if (index < 0 || index >= this.albumDataItems.length) { 49 Log.warn(TAG, `${index}/${this.albumDataItems.length}`); 50 return undefined; 51 } 52 this.albumDataItems[index].index = index; 53 return this.albumDataItems[index] 54 } 55 56 isSelect(): boolean { 57 let isSelect = true; 58 for (let i = 0;i < this.albumDataItems.length; i++) { 59 if (!this.albumDataItems[i].isSelect) { 60 isSelect = false; 61 break; 62 } 63 } 64 return isSelect; 65 } 66 67 resetLoadState(): void { 68 for (let i = 0;i < this.albumDataItems.length; i++) { 69 if (this.albumDataItems[i].status == MediaConstants.LOADED) { 70 this.albumDataItems[i].status = MediaConstants.UNDEFINED; 71 } 72 } 73 } 74 75 getAlbumDataItemById(id: string): AlbumDataItem { 76 let albumDataItem: AlbumDataItem = undefined; 77 for (let i = 0;i < this.albumDataItems.length; i++) { 78 if (this.albumDataItems[i].id == id) { 79 albumDataItem = this.albumDataItems[i]; 80 } 81 } 82 return albumDataItem; 83 } 84 85 getSelectedUris(): string[] { 86 let uris: string[] = []; 87 this.albumDataItems.forEach((item: AlbumDataItem) => { 88 if (item.isSelect) { 89 uris.push(item.uri); 90 } 91 }) 92 return uris; 93 } 94 95 isDisableRename(): boolean { 96 let isDisableRename = false; 97 for (let i = 0;i < this.albumDataItems.length; i++) { 98 if (this.albumDataItems[i].isSelect && this.albumDataItems[i].isDisableRename) { 99 isDisableRename = true; 100 break; 101 } 102 } 103 return isDisableRename; 104 } 105 106 isDisableDelete(): boolean { 107 let isDisableDelete = false; 108 for (let i = 0;i < this.albumDataItems.length; i++) { 109 if (this.albumDataItems[i].isSelect && this.albumDataItems[i].isDisableDelete) { 110 isDisableDelete = true; 111 break; 112 } 113 } 114 return isDisableDelete; 115 } 116 117 setSelect(isSelect: boolean) { 118 this.albumDataItems.forEach((item: AlbumDataItem) => { 119 item.setSelect(isSelect); 120 }) 121 } 122 123 getSelectedCount(): number { 124 let count = 0; 125 for (let i = 0;i < this.albumDataItems.length; i++) { 126 if (this.albumDataItems[i].isSelect) { 127 count++; 128 } 129 } 130 return count; 131 } 132 133 getSelectedItems(): AlbumDataItem[] { 134 let items: AlbumDataItem[] = []; 135 this.albumDataItems.forEach((item: AlbumDataItem) => { 136 if (item.isSelect) { 137 items.push(item); 138 } 139 }) 140 return items; 141 } 142 143 onDataUpdate(index: number): void { 144 Log.info(TAG, `onDataUpdate ${index}`); 145 this.notifyDataChange(index); 146 } 147 148 dataReload() { 149 this.reloadAlbumItemData().then((isEmpty: boolean) => { 150 this.notifyDataReload(); 151 }) 152 } 153 154 dataRemove() { 155 for (let i = this.albumDataItems.length - 1;i >= 0; i--) { 156 if (this.albumDataItems[i].isDeleted()) { 157 this.albumDataItems.splice(i, 1); 158 super.notifyDataDelete(i); 159 } 160 } 161 } 162 163 async reloadAlbumItemData(): Promise<boolean> { 164 this.albumDataItems = await this.albumDataImpl.reloadAlbumItemData(); 165 return this.albumDataItems.length == 0; 166 } 167 168 async reloadAlbumListItemData(): Promise<boolean> { 169 Log.info(TAG, `reloadAlbumListItemData`); 170 this.albumDataItems = await this.albumDataImpl.reloadAlbumListItemData(); 171 this.reloadResetAlbumItemData().then((count: number) => { 172 Log.info(TAG, `reloadResetAlbumItemData reset: ${count}`); 173 }) 174 return this.albumDataItems.length == 0; 175 } 176 177 async reloadResetAlbumItemData(): Promise<number> { 178 let albumResetDataItems = await this.albumDataImpl.reloadResetAlbumItemData(); 179 albumResetDataItems.forEach((item: AlbumDataItem) => { 180 this.albumDataItems.push(item); 181 }); 182 this.notifyDataReload(); 183 return albumResetDataItems.length; 184 } 185}