• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2022-2023 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 */
15
16import { AlbumDefine } from '../AlbumDefine';
17import { AlbumInfo } from './AlbumInfo';
18import type { AsyncCallback } from '../../common/AsyncCallback';
19import { BrowserDataImpl } from '../BrowserDataImpl';
20import type { Album, FetchOptions } from '../../../access/UserFileManagerAccess';
21import { UserFileManagerAccess } from '../../../access/UserFileManagerAccess';
22import { Log } from '../../../utils/Log';
23import { Constants } from '../../common/Constants';
24import { MediaItem } from '../photo/MediaItem';
25
26const TAG: string = 'common_AlbumDataImpl';
27
28type AlbumInfoEx = {
29  relativePath?: string
30};
31
32type QueryAlbumParam = {
33  filterMediaType?: string;
34  uris?: string[]
35};
36
37export type InitAlbumParam = {
38  deviceId?: string,
39  deviceName?: string,
40  moreInfo?: boolean
41};
42
43export type AlbumSimpleInfo = {
44  uris: string[],
45  count: number,
46  videoCount: number,
47};
48
49export class AlbumDataImpl extends BrowserDataImpl {
50  private moreInfo: boolean = false;
51
52  constructor(param: InitAlbumParam) {
53    super();
54
55    if (param && param.moreInfo) {
56      this.moreInfo = param.moreInfo
57    }
58  }
59
60  getDataByUri(uri: unknown) {
61  }
62
63  getData(callback: AsyncCallback<unknown>, param: QueryAlbumParam): void {
64    Log.info(TAG, 'load data  getData start : ' + param);
65    if (param == null) {
66      this.buildAlbums(callback);
67    } else if (param?.filterMediaType != undefined) {
68      this.buildAlbums(callback, param.filterMediaType);
69    } else {
70      // 删除相册时,计算图片视频数量
71      this.genAlbumsInfo(callback, param.uris);
72    }
73  }
74
75  async getDataByName(name: string, albumUri?: string): Promise<Album> {
76    let albums = await UserFileManagerAccess.getInstance().getUserAlbums(AlbumDefine.getAlbumFetchOptByName(name));
77    if (albums && albums.length > 0) {
78      let opt: FetchOptions = AlbumDefine.getFileFetchOpt();
79      let fileResult = await albums[0].getPhotoAssets(opt);
80      if (fileResult == null || fileResult == undefined) {
81        Log.warn(TAG, `not valid fileResult`);
82        return null;
83      }
84      let count = fileResult.getCount();
85      fileResult.close();
86      if (count <= 0) {
87        Log.warn(TAG, `Not valid album Name: ${albums[0].albumName}, URI: ${albums[0].albumUri}`);
88        return null;
89      }
90      return albums[0];
91    } else {
92      return null;
93    }
94  }
95
96  getDataCount(callback: AsyncCallback<unknown>, albumInfo: AlbumInfo): void {
97  }
98
99  getDataIndexByUri(callback: AsyncCallback<unknown>, param: QueryAlbumParam, uri: string): void {
100  }
101
102  getDataIndexById(callback: AsyncCallback<unknown>, param: QueryAlbumParam, id: number): void {
103  }
104
105  private async genAlbumsInfo(cb: AsyncCallback<AlbumSimpleInfo>, uris: string[]): Promise<void> {
106    Log.info(TAG, `genAlbumsInfo uris: ${JSON.stringify(uris)}`);
107    Log.info(TAG, 'load data  genAlbumsInfo start');
108
109    let res = {
110      uris: [],
111      count: 0,
112      videoCount: 0,
113    };
114
115    for (let uri of uris) {
116      let objects = await super.getItems(uri, Constants.INVALID, Constants.INVALID);
117      Log.info(TAG, `get album objects: uri: ${uri} length: ${objects.length}`);
118
119      res.count += objects.length;
120      for (let item of objects) {
121        if (item.fileType === UserFileManagerAccess.MEDIA_TYPE_VIDEO) {
122          res.videoCount++;
123        }
124        res.uris.push(item.uri);
125      }
126    }
127
128    Log.info(TAG, `genAlbumsInfo done`);
129    cb.callback(res);
130  }
131
132  private async buildAlbums(callback: AsyncCallback<AlbumInfo[]>, filterMediaType?: string) {
133    Log.debug(TAG, `buildAlbums`);
134    let sourceData = new Array<AlbumInfo>();
135    await this.getSystemAlbumsInfo(sourceData, filterMediaType);
136    await this.getUserAlbumsInfo(sourceData, filterMediaType);
137    await this.getTrashAlbumInfo(sourceData, filterMediaType);
138    callback.callback(sourceData);
139  }
140
141  private async getUserAlbumsInfo(albumArray: Array<AlbumInfo>, filterMediaType?: string): Promise<void> {
142    Log.debug(TAG, 'getUserAlbumsInfo');
143
144    let albums: Album[] = await UserFileManagerAccess.getInstance().getUserAlbums();
145    Log.debug(TAG, `getUserAlbumsInfo albums is : ${albums}`);
146    if (albums) {
147      for (let album of albums) {
148        let albumInfo: AlbumInfo = new AlbumInfo(album);
149        let albumName: string = await UserFileManagerAccess.getInstance().getAlbumName(album);
150        albumInfo.setAlbumName(albumName);
151        albumInfo.setFilterMediaType(filterMediaType);
152        // 没有相册,设置为第一张
153        if (!album.coverUri) {
154          await UserFileManagerAccess.getInstance().getAlbumFirstObject(album).then((obj) => {
155            if (obj) {
156              let mediaItem = new MediaItem(obj);
157              mediaItem.setThumbnail(this.getThumbnailSafe(obj.uri, String(obj.get(Constants.KEY_FILE_DATA))));
158              albumInfo.setMediaItem(mediaItem);
159              albumInfo.setCoverUri(this.getThumbnailSafe(obj.uri, String(obj.get(Constants.KEY_FILE_DATA))));
160            }
161          });
162        } else {
163          await UserFileManagerAccess.getInstance().getFirstObject(AlbumDefine.getFileFetchOptByUri(album.coverUri)).then((obj) => {
164            if (obj) {
165              let mediaItem = new MediaItem(obj.obj);
166              mediaItem.setThumbnail(this.getThumbnailSafe(obj.obj.uri, String(obj.obj.get(Constants.KEY_FILE_DATA))));
167              albumInfo.setMediaItem(mediaItem);
168              albumInfo.setCoverUri(this.getThumbnailSafe(obj.obj.uri, String(obj.obj.get(Constants.KEY_FILE_DATA))));
169            }
170          });
171        }
172        let count = await this.getItemsCount(album.albumUri);
173        albumInfo.setCount(count); // TODO album.count不为0时,在构造函数里直接获取
174        // 相册的视频数量
175        let videoCount = await this.getItemsCount(album.albumUri, AlbumDefine.FILTER_MEDIA_TYPE_VIDEO);
176        albumInfo.setVideoCount(videoCount);
177        Log.debug(TAG, `getUserAlbumsInfo albumInfo is : ${albumInfo}`);
178        albumArray.push(albumInfo);
179        Log.debug(TAG, `getUserAlbumsInfo albumArray length is : ${albumArray.length}`);
180      }
181    } else {
182      Log.error(TAG, 'Failed getUserAlbumsInfo');
183    }
184
185    Log.debug(TAG, 'getUserAlbumsInfo done');
186  }
187
188
189  private async getSystemAlbumsInfo(albumArray: Array<AlbumInfo>, filterMediaType?: string): Promise<void> {
190    Log.debug(TAG, 'getSystemAlbumsInfo');
191
192    let albums: Album[] = await UserFileManagerAccess.getInstance().getSystemAlbums();
193    Log.debug(TAG, `getSystemAlbumsInfo albums is : ${albums}`);
194
195    if (albums) {
196      for (let album of albums) {
197        Log.info(TAG, `album ${JSON.stringify(album)}`)
198        let albumInfo: AlbumInfo = new AlbumInfo(album);
199        let count = await this.getItemsCount(album.albumUri);
200        // 系统相册为空时不展示
201        if (count === 0) {
202          continue;
203        }
204        albumInfo.setCount(count); // TODO album.count不为0时,在构造函数里直接获取
205        // 相册的视频数量
206        let videoCount = await this.getItemsCount(album.albumUri, AlbumDefine.FILTER_MEDIA_TYPE_VIDEO);
207        albumInfo.setVideoCount(videoCount);
208        let albumName: string = await UserFileManagerAccess.getInstance().getAlbumName(album);
209        albumInfo.setAlbumName(albumName);
210        albumInfo.setFilterMediaType(filterMediaType);
211        if (!album.coverUri) {
212          await UserFileManagerAccess.getInstance().getAlbumFirstObject(album).then((obj) => {
213            if (obj) {
214              let mediaItem = new MediaItem(obj);
215              mediaItem.setThumbnail(this.getThumbnailSafe(obj.uri, String(obj.get(Constants.KEY_FILE_DATA))));
216              albumInfo.setMediaItem(mediaItem);
217              albumInfo.setCoverUri(this.getThumbnailSafe(obj.uri, String(obj.get(Constants.KEY_FILE_DATA))));
218            }
219          });
220        } else {
221          await UserFileManagerAccess.getInstance().getFirstObject(AlbumDefine.getFileFetchOptByUri(album.coverUri)).then((obj) => {
222            if (obj) {
223              let mediaItem = new MediaItem(obj.obj);
224              mediaItem.setThumbnail(this.getThumbnailSafe(obj.obj.uri, String(obj.obj.get(Constants.KEY_FILE_DATA))));
225              albumInfo.setMediaItem(mediaItem);
226              albumInfo.setCoverUri(this.getThumbnailSafe(obj.obj.uri, String(obj.obj.get(Constants.KEY_FILE_DATA))));
227            }
228          });
229        }
230        Log.debug(TAG, `getSystemAlbumsInfo albumInfo is : ${albumInfo}`);
231        albumArray.push(albumInfo);
232        Log.debug(TAG, `getSystemAlbumsInfo albumArray length is : ${albumArray.length}`);
233      }
234    } else {
235      Log.error(TAG, 'Failed getSystemAlbumsInfo');
236    }
237
238    Log.debug(TAG, 'getSystemAlbumsInfo done');
239  }
240
241  private async getTrashAlbumInfo(albumArray: Array<AlbumInfo>, filterMediaType?: string): Promise<void> {
242    Log.debug(TAG, 'getTrashAlbumInfo');
243    let album: Album = await UserFileManagerAccess.getInstance().getTrashAlbum();
244    Log.debug(TAG, `getTrashAlbumInfo albums is : ${album}`);
245    let albumInfo: AlbumInfo = new AlbumInfo(album);
246    let count = await this.getItemsCount(album.albumUri);
247    // 系统相册为空时不展示
248    if (count === 0) {
249      Log.warn(TAG, 'getTrashAlbumInfo count is 0');
250      return;
251    }
252    albumInfo.setCount(count);
253    let albumName: string = await UserFileManagerAccess.getInstance().getAlbumName(album);
254    albumInfo.setAlbumName(albumName);
255    albumInfo.setFilterMediaType(filterMediaType);
256    Log.debug(TAG, `getTrashAlbumInfo albumArray albumInfo is : ${albumInfo}`);
257    albumArray.push(albumInfo);
258    Log.debug(TAG, `getTrashAlbumInfo albumArray length is : ${albumArray.length}`);
259    Log.debug(TAG, 'getSystemAlbumsInfo done');
260  }
261}