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