• 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 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}