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}