• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}