• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2021-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 { getFileIcon, randomId, formatSuffix } from '../../base/utils/Tools'
17import { MILLISECOND } from '../../base/constants/Constant'
18import fileAccess from '@ohos.file.fileAccess'
19import { THUMBNAIL_SIZE } from '../../base/constants/UiConstant'
20import { FileMimeTypeUtil } from '../../base/utils/FileMimeTypeUtil'
21import { MimeType } from './MimeType'
22import { BasicDataSource } from './BasicDataSource'
23import fileExtensionInfo from '@ohos.file.fileExtensionInfo'
24import AbilityCommonUtil from '../../base/utils/AbilityCommonUtil'
25import { FileUtil } from '../../base/utils/FileUtil'
26import { ArrayUtil } from '../../base/utils/ArrayUtil'
27
28export class BreadData {
29  title: string
30  url: string
31  fileIterator?: fileAccess.FileInfo
32
33  constructor(obj) {
34    this.title = obj.title
35    this.url = obj.url
36    this.fileIterator = obj.fileIterator
37  }
38}
39
40export class FileDataSource extends BasicDataSource {
41  private dataArray: FilesData[] = []
42  dataCount: number = 0
43
44  public totalCount(): number {
45    return this.dataArray.length
46  }
47
48  public getDataArray(): FilesData[] {
49    return this.dataArray
50  }
51
52  public getFileList(): FilesData[] {
53    return this.dataArray.filter(item =>!item.isFolder)
54  }
55
56  public setData(data: FilesData[]): void {
57    this.dataArray = [...data]
58    this.dataCount = this.dataArray.length
59    this.notifyDataReload()
60  }
61
62  public getData(index: number): FilesData {
63    return this.dataArray[index]
64  }
65
66  public selectAll(isSelected): void {
67    this.dataArray.forEach(item => {
68      item.isChecked = isSelected
69    })
70  }
71
72  public getIndex(uri): number {
73    return this.dataArray.findIndex(item => item.uri === uri)
74  }
75
76  public getSelectedFileList(): FilesData[] {
77    return this.dataArray.filter(item => item.isChecked)
78  }
79
80  public replaceData(index, data: FilesData): void {
81    this.dataArray.splice(index, 1, data)
82    this.notifyDataChange(index)
83  }
84
85  public addData(index: number, data: FilesData): void {
86    this.dataArray.splice(index, 0, data)
87    this.dataCount = this.dataArray.length
88    this.notifyDataAdd(index)
89  }
90
91  public pushData(data: FilesData): void {
92    this.dataArray.push(data)
93    this.dataCount = this.dataArray.length
94    this.notifyDataAdd(this.dataArray.length - 1)
95  }
96
97  public deleteData(index: number): void {
98    this.dataArray.splice(index, 1)
99    this.dataCount = this.dataArray.length
100    this.notifyDataDelete(index)
101  }
102}
103
104export class FilesData {
105  id: string
106  uri: string
107  thumbUri: string
108  displayName: string
109  deviceId: string
110  flags: number
111  name: string
112  fileName: string
113  mode: string
114  size: number
115  mtime: number
116  suffix: string
117  mimeType: string
118  icon: any
119  gridIcon: any
120  localGridIcon: any
121  isChecked: boolean
122  path?: string
123  sub?: number
124  scale?: number
125  angle?: number
126  offsetX?: number | string
127  offsetY?: number | string
128  picWidth?: number | string
129  picHeight?: number | string
130  fileIterator?: fileAccess.FileInfo
131  isMedia: boolean = false
132  isImage: boolean = false
133  isVideo: boolean = false
134  isAudio: boolean = false
135  isFolder: boolean = false
136  duration: number
137  mimeTypeObj: MimeType
138  subFolderList: Array<FilesData>;
139  subFileList: Array<FilesData>;
140  layer:number;
141  autoShow: boolean = false;
142  currentDir?: string;
143
144  constructor(obj) {
145    this.isFolder = obj.isFolder || FileUtil.isFolder(obj.mode);
146    this.id = obj.id || randomId()
147    this.uri = obj.uri || ''
148    this.deviceId = obj.deviceId || ''
149    this.flags = obj.flags || 0
150    this.name = obj.name || ''
151    this.fileName = obj.fileName || obj.displayName || ''
152    this.suffix = formatSuffix(this.fileName)
153    this.mode = obj.mode || ''
154    this.size = obj.size || 0
155    this.mtime = obj.mtime * MILLISECOND.ONE_SECOND || 0
156    this.mimeType = obj.mimeType || ''
157    this.isChecked = false
158    this.path = obj.path || obj.relativePath || ''
159    this.sub = obj.sub || 0
160    this.scale = obj.scale || 1
161    this.angle = obj.angle || 0
162    this.offsetX = obj.offsetX || 0
163    this.offsetY = obj.offsetY || 0
164    this.picWidth = obj.picWidth || '100%'
165    this.picHeight = obj.picHeight || '100%'
166    this.fileIterator = obj.fileIterator
167    this.duration = obj.duration || 0
168    this.mimeTypeObj = getFileIcon(this.fileName, this.isFolder)
169    this.icon = this.mimeTypeObj.getResID()
170    this.gridIcon = this.mimeTypeObj.getGridResID()
171    this.localGridIcon = this.mimeTypeObj.getLocalGridResID()
172    if (this.mimeTypeObj.isMedia()) {
173      this.thumbUri = this.uri
174    }
175    if (this.isFolder) {
176      this.sub = getSubFileNum(this.fileIterator)
177    }
178    this.currentDir = FileUtil.getCurrentDir(this.path, this.isFolder);
179  }
180
181  setFileName(fileName: string): void {
182    this.fileName = fileName
183    this.mimeTypeObj = getFileIcon(this.fileName)
184    this.icon = this.mimeTypeObj.getResID()
185    this.gridIcon = this.mimeTypeObj.getGridResID()
186    this.localGridIcon = this.mimeTypeObj.getLocalGridResID()
187    if (this.mimeTypeObj.isMedia()) {
188      this.thumbUri = `${this.uri}/thumbnail/${THUMBNAIL_SIZE.WIDTH}/${THUMBNAIL_SIZE.HEIGHT}`
189    }
190  }
191
192  pickFile(): void {
193    AbilityCommonUtil.terminateFilePicker([this.uri], [this.fileName])
194  }
195
196  setSubFolderList(subFolderList: Array<FilesData>) {
197    this.subFolderList = subFolderList;
198  }
199
200  setSubList(subList: Array<FilesData>) {
201    if (!ArrayUtil.isEmpty(subList)) {
202      let folderList = new Array<FilesData>();
203      let fileList = new Array<FilesData>();
204      for (let i = 0; i < subList.length; i++) {
205        let fileData: FilesData = subList[i];
206        if (fileData.isFolder) {
207          folderList.push(fileData);
208        } else {
209          fileList.push(fileData);
210        }
211      }
212      this.subFolderList = folderList;
213      this.subFileList = fileList;
214    }
215  }
216
217  hasSubFolderList(): boolean {
218    if (ArrayUtil.isEmpty(this.subFolderList)) {
219      return false;
220    }
221    return this.subFolderList.length > 0;
222  }
223
224  getSubFolderList(): Array<FilesData> {
225    return this.subFolderList;
226  }
227
228  setLayer(layer: number) {
229    this.layer = layer;
230  }
231
232  getLayer(): number {
233    if (this.layer) {
234      return this.layer;
235    }
236    return 1;
237  }
238}
239
240
241export function getSubFileNum(fileInfo: fileAccess.FileInfo): number {
242  let subFileNum = 0
243  if (!fileInfo) {
244    return subFileNum
245  }
246  let fileIterator = fileInfo.listFile()
247  if (!fileIterator) {
248    return subFileNum
249  }
250  let result = fileIterator.next()
251  let isDone = result.done
252  while (!isDone) {
253    subFileNum += 1
254    result = fileIterator.next()
255    isDone = result.done
256  }
257  return subFileNum
258}
259
260export class selectedFileData {
261  id?: string
262  uri: string
263  mimeType: string
264  thumbUri: string
265  title: string
266  fileName: string
267  mode: string
268  relativePath: string
269  size: number
270  albumUri: string
271  albumName: string
272  isFolder: boolean
273  displayName?: string
274
275  constructor(obj) {
276    this.id = obj.id || -1
277    this.uri = obj.uri || ''
278    this.mimeType = obj.mimetype || ''
279    this.thumbUri = obj.thumbUri || ''
280    this.title = obj.title || ''
281    this.fileName = obj.fileName || obj.displayName || ''
282    this.mode = obj.mode || ''
283    this.isFolder = obj.isFolder
284    this.relativePath = obj.relativePath || ''
285    this.size = obj.size || 0
286    this.albumUri = obj.albumUri || ''
287    this.albumName = obj.albumName || ''
288  }
289}
290
291export class FileData {
292  id: string
293  fileName: string
294  thumbnail: string
295  editedTime: string
296  subItemSize: number
297  parentFolder: string
298  fileType: string
299  fileSize: number
300  isChecked: boolean
301  children: []
302
303  constructor(id: string, fileName: string, thumbnail: string, editedTime: string, subItemSize: number, parentFolder: string, fileType: string, fileSize: number, isChecked: boolean, children: []) {
304    this.id = id
305    this.fileName = fileName
306    this.thumbnail = thumbnail
307    this.editedTime = editedTime
308    this.subItemSize = subItemSize
309    this.parentFolder = parentFolder
310    this.fileType = fileType
311    this.fileSize = fileSize
312    this.isChecked = isChecked
313    this.children = children
314  }
315}
316
317export class fileDetail {
318  key: string | Resource
319  value: string | Resource
320  path?: string = ''
321  params?: any
322
323  constructor(key: string, value: string, path: string, params: any) {
324    this.key = key
325    this.value = value
326    this.path = path
327    this.params = params
328  }
329}
330
331export class bottomOptions {
332  optionName: string
333  name: string
334  icon: Resource
335  disabled: boolean = false
336  display: boolean = true
337
338  constructor(optionName: string, name: string, icon: Resource, disabled: boolean, display: boolean) {
339    this.optionName = optionName
340    this.name = name
341    this.icon = icon
342    this.disabled = disabled
343    this.display = display
344  }
345}