1/* 2 * Copyright (C) 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 { AsyncCallback, Callback, BusinessError } from '@ohos.base'; 17import image from '@ohos.multimedia.image'; 18import dataSharePredicates from '@ohos.data.dataSharePredicates'; 19import Context from 'application.Context'; 20 21 22class SizeImpl implements image.Size { 23 height: int = 0; 24 width: int = 0; 25} 26 27type ResolveVoid = (v: PromiseLike<void>) => void; 28type RejectString = (e: BusinessError<string>) => void; 29 30function businessError<T = void>(c: number, d?: string): BusinessError<T> { 31 let err: BusinessError<T> = new BusinessError<T>(); 32 err.code = c; 33 err.message = d ? d : ""; 34 return err; 35} 36 37function isNullish(d: NullishType): boolean { 38 return (d === null || d === undefined) ? true : false; 39} 40 41class MediaLibraryAniError extends Error { 42 code: number; 43 44 constructor(code: number, message: string) { 45 super('MediaLibraryAniError', message, undefined); 46 this.code = code; 47 } 48} 49 50export namespace photoAccessHelper { 51 loadLibrary("photo_access_helper_ani"); 52 export native function getPhotoAccessHelper(context: Context): PhotoAccessHelper; 53 54 export enum PhotoType { 55 IMAGE = 1, 56 VIDEO 57 } 58 59 export enum PhotoSubtype { 60 DEFAULT = 0, 61 SCREENSHOT = 1, 62 MOVING_PHOTO = 3, 63 BURST = 4, 64 } 65 66 export enum DynamicRangeType { 67 SDR = 0, 68 HDR = 1 69 } 70 71 export enum PositionType { 72 LOCAL = 1 << 0, 73 CLOUD = 1 << 1 74 } 75 76 export enum AnalysisType { 77 ANALYSIS_AESTHETICS_SCORE = 0, 78 ANALYSIS_LABEL, 79 ANALYSIS_OCR, 80 ANALYSIS_FACE, 81 ANALYSIS_OBJECT, 82 ANALYSIS_RECOMMENDATION, 83 ANALYSIS_SEGMENTATION, 84 ANALYSIS_COMPOSITION, 85 ANALYSIS_SALIENCY, 86 ANALYSIS_DETAIL_ADDRESS, 87 ANALYSIS_HUMAN_FACE_TAG, 88 ANALYSIS_HEAD_POSITION, 89 ANALYSIS_BONE_POSE, 90 ANALYSIS_VIDEO_LABEL, 91 ANALYSIS_HIGHLIGHT, 92 ANALYSIS_MULTI_CROP 93 } 94 95 export enum RecommendationType { 96 QR_OR_BAR_CODE = 1, 97 QR_CODE = 2, 98 BAR_CODE = 3, 99 ID_CARD = 4, 100 PROFILE_PICTURE = 5, 101 PASSPORT = 6, 102 BANK_CARD = 7, 103 DRIVER_LICENSE = 8, 104 DRIVING_LICENSE = 9, 105 FEATURED_SINGLE_PORTRAIT = 10 106 } 107 108 export enum DeliveryMode { 109 FAST_MODE = 0, 110 HIGH_QUALITY_MODE = 1, 111 BALANCE_MODE = 2 112 } 113 114 export enum CompatibleMode { 115 ORIGINAL_FORMAT_MODE = 0, 116 COMPATIBLE_FORMAT_MODE = 1 117 } 118 119 export interface MediaAssetProgressHandler { 120 onProgress(progress: number): void; 121 } 122 123 export enum SourceMode { 124 ORIGINAL_MODE = 0, 125 EDITED_MODE = 1 126 } 127 128 export enum PhotoPermissionType { 129 TEMPORARY_READ_IMAGEVIDEO = 0, 130 PERSISTENT_READ_IMAGEVIDEO = 1 131 } 132 133 export enum HideSensitiveType { 134 HIDE_LOCATION_AND_SHOOTING_PARAM = 0, 135 HIDE_LOCATION_ONLY = 1, 136 HIDE_SHOOTING_PARAM_ONLY = 2, 137 NO_HIDE_SENSITIVE_TYPE = 3 138 } 139 140 export enum AuthorizationMode { 141 SHORT_TIME_AUTHORIZATION = 0 142 } 143 144 export enum CompleteButtonText { 145 TEXT_DONE = 0, 146 TEXT_SEND = 1, 147 TEXT_ADD = 2, 148 } 149 150 export enum WatermarkType { 151 DEFAULT = 0, 152 BRAND_COMMON = 1, 153 COMMON = 2, 154 BRAND = 3, 155 } 156 157 export interface RequestOptions { 158 deliveryMode: DeliveryMode; 159 sourceMode?: SourceMode; 160 compatibleMode?: CompatibleMode; 161 mediaAssetProgressHandler?: MediaAssetProgressHandler; 162 } 163 164 export interface MediaAssetDataHandler<T> { 165 onDataPrepared(data: T, map?: Map<string, string>): void; 166 } 167 168 export interface QuickImageDataHandler<T> { 169 onDataPrepared(data: T, imageSource: image.ImageSource, map: Map<string, string>): void; 170 } 171 172 export interface PhotoProxy {} 173 174 export class MediaAssetManager { 175 } 176 177 export type MemberType = number | string | boolean; 178 179 export interface PhotoAsset { 180 readonly uri: string; 181 readonly photoType: PhotoType; 182 readonly displayName: string; 183 184 get(member: string): MemberType; 185 set(member: string, value: string): void; 186 commitModify(callback: AsyncCallback<void>): void; 187 commitModify(): Promise<void>; 188 open(mode: string, callback: AsyncCallback<number | undefined>): void; 189 open(mode: string): Promise<number>; 190 close(fd: number, callback: AsyncCallback<void>): void; 191 close(fd: number): Promise<void>; 192 getThumbnail(callback: AsyncCallback<image.PixelMap | undefined>): void; 193 getThumbnail(size: image.Size, callback: AsyncCallback<image.PixelMap | undefined>): void; 194 getThumbnail(size?: image.Size): Promise<image.PixelMap>; 195 setFavorite(favoriteState: boolean, callback: AsyncCallback<void>): void; 196 setFavorite(favoriteState: boolean): Promise<void>; 197 setHidden(hiddenState: boolean, callback: AsyncCallback<void>): void; 198 setHidden(hiddenState: boolean): Promise<void>; 199 setUserComment(userComment: string, callback: AsyncCallback<void>): void; 200 setUserComment(userComment: string): Promise<void>; 201 getAnalysisData(analysisType: AnalysisType): Promise<string>; 202 } 203 204 class PhotoAssetHandle implements PhotoAsset { 205 readonly uri: string = ""; 206 readonly photoType: PhotoType; 207 readonly displayName: string = ""; 208 209 private nativePhotoAsset: long = 0; 210 constructor(context: long) { 211 if (this.nativePhotoAsset == 0) { 212 this.nativePhotoAsset = context; 213 } 214 } 215 216 native static create(): PhotoAsset; 217 native set(member: string, value: string): void; 218 native get(member: string): MemberType; 219 native commitModifySync(): void; 220 native openSync(mode: string): number; 221 native closeSync(fd: number): void; 222 native getThumbnailSync(size?: image.Size): image.PixelMap; 223 native setFavoriteSync(favoriteState: boolean): void; 224 native setHiddenSync(hiddenState: boolean): void; 225 native setUserCommentSync(userComment: string): void; 226 native getAnalysisDataSync(analysisType: AnalysisType): string; 227 228 commitModify(): Promise<void> { 229 return new Promise<void>((resolve: (v: PromiseLike<void>) => void, reject: RejectString) => { 230 let cb = (): PromiseLike<void> => { this.commitModifySync() }; 231 taskpool.execute(cb).then((ret: NullishType): void => { 232 if (ret === null || ret === undefined) { 233 let err: BusinessError<string> = { 234 code: -1, 235 data: "Operation failed", 236 name: "", 237 message: "" 238 }; 239 reject(err); 240 } else { 241 resolve(ret as PromiseLike<void>); 242 } 243 }); 244 }); 245 } 246 commitModify(callback: AsyncCallback<void, void>): void { 247 let task = new taskpool.Task(() =>this.commitModifySync()); 248 let p1 = taskpool.execute(task); 249 p1.then((ret: NullishType) => { 250 let eNull: BusinessError<void> = { 251 code: -1, 252 name: "", 253 message: "" 254 }; 255 if (ret === null || ret === undefined) { 256 eNull.code = -1; 257 callback(eNull, undefined); 258 } else { 259 eNull.code = 0; 260 callback(eNull, undefined); 261 } 262 }); 263 } 264 265 open(mode: string): Promise<number> { 266 return new Promise<number>((resolve : (v: number) => void, reject : RejectString) => { 267 let cb = (): number => { return this.openSync(mode) }; 268 taskpool.execute(cb).then((ret: NullishType): void => { 269 if (ret === null || ret === undefined) { 270 let err: BusinessError<string> = { 271 code: -1, 272 data: "Operation failed", 273 name: "", 274 message: "" 275 }; 276 reject(err); 277 } else { 278 resolve(ret as number); 279 } 280 }); 281 }); 282 } 283 open(mode: string, callback: AsyncCallback<number | undefined, void>): void { 284 let task = new taskpool.Task(() =>this.openSync(mode)); 285 let p1 = taskpool.execute(task); 286 p1.then((ret: NullishType) => { 287 let eNull: BusinessError<void> = { 288 code: -1, 289 name: "", 290 message: "" 291 }; 292 if (ret === null || ret === undefined) { 293 eNull.code = -1; 294 callback(eNull, undefined); 295 } else { 296 let result = ret as number; 297 eNull.code = 0; 298 callback(eNull, result); 299 } 300 }); 301 } 302 303 close(fd: number): Promise<void> { 304 return new Promise<void>((resolve: (v: PromiseLike<void>) => void, reject: RejectString) => { 305 let cb = (): PromiseLike<void> => { this.closeSync(fd) }; 306 taskpool.execute(cb).then((ret: NullishType): void => { 307 resolve(ret as PromiseLike<void>); 308 }); 309 }); 310 } 311 close(fd: number, callback: AsyncCallback<void, void>): void { 312 let task = new taskpool.Task(() =>this.closeSync(fd)); 313 let p1 = taskpool.execute(task); 314 p1.then((ret: NullishType) => { 315 let eNull: BusinessError<void> = { 316 code: -1, 317 name: "", 318 message: "" 319 }; 320 if (ret === null || ret === undefined) { 321 eNull.code = -1; 322 callback(eNull, undefined); 323 } else { 324 eNull.code = 0; 325 callback(eNull, undefined); 326 } 327 }); 328 } 329 330 getThumbnail(size?: image.Size): Promise<image.PixelMap> { 331 return new Promise<image.PixelMap>((resolve : (v: image.PixelMap) => void, reject: RejectString) => { 332 let cb = (): image.PixelMap => { return this.getThumbnailSync(size) }; 333 taskpool.execute(cb).then((ret: NullishType): void => { 334 if (ret === null || ret === undefined) { 335 let ret1: BusinessError<string> = { 336 code: -1, 337 data: "Operation failed", 338 name: "", 339 message: "" 340 }; 341 reject(ret1); 342 } else { 343 let pixelMap = ret as image.PixelMap; 344 resolve(pixelMap); 345 } 346 }); 347 }); 348 } 349 350 getThumbnail(callback: AsyncCallback<image.PixelMap | undefined, void>): void { 351 let task = new taskpool.Task(() =>this.getThumbnailSync()); 352 let p1 = taskpool.execute(task); 353 p1.then((ret: NullishType) => { 354 let eNull: BusinessError<void> = { 355 code: -1, 356 name: "", 357 message: "" 358 }; 359 if (ret === null || ret === undefined) { 360 eNull.code = -1; 361 callback(eNull, undefined); 362 } else { 363 let result = ret as image.PixelMap; 364 eNull.code = 0; 365 callback(eNull, result); 366 } 367 }); 368 } 369 370 getThumbnail(size: image.Size, callback: AsyncCallback<image.PixelMap | undefined, void>): void { 371 let task = new taskpool.Task(() =>this.getThumbnailSync(size)); 372 let p1 = taskpool.execute(task); 373 p1.then((ret: NullishType) => { 374 let eNull: BusinessError<void> = { 375 code: -1, 376 name: "", 377 message: "" 378 }; 379 if (ret === null || ret === undefined) { 380 eNull.code = -1; 381 callback(eNull, undefined); 382 } else { 383 let result = ret as image.PixelMap; 384 eNull.code = 0; 385 callback(eNull, result); 386 } 387 }); 388 } 389 390 setFavorite(favoriteState: boolean): Promise<void> { 391 return new Promise<void>((resolve: (v: PromiseLike<void>) => void, reject: RejectString) => { 392 let cb = (): PromiseLike<void> => { this.setFavoriteSync(favoriteState) }; 393 taskpool.execute(cb).then((ret: NullishType): void => { 394 if (ret === null || ret === undefined) { 395 let err: BusinessError<string> = { 396 code: -1, 397 data: "Operation failed", 398 name: "", 399 message: "" 400 }; 401 reject(err); 402 } else { 403 resolve(ret as PromiseLike<void>); 404 } 405 }); 406 }); 407 } 408 409 setFavorite(favoriteState: boolean, callback: AsyncCallback<void, void>): void { 410 let task = new taskpool.Task(() =>this.setFavoriteSync(favoriteState)); 411 let p1 = taskpool.execute(task); 412 p1.then((ret: NullishType) => { 413 let eNull: BusinessError<void> = { 414 code: -1, 415 name: "", 416 message: "" 417 }; 418 if (ret === null || ret === undefined) { 419 eNull.code = -1; 420 callback(eNull, undefined); 421 } else { 422 eNull.code = 0; 423 callback(eNull, undefined); 424 } 425 }); 426 } 427 428 setHidden(hiddenState: boolean): Promise<void> { 429 return new Promise<void>((resolve: (v: PromiseLike<void>) => void, reject: RejectString) => { 430 let cb = (): PromiseLike<void> => { this.setHiddenSync(hiddenState) }; 431 taskpool.execute(cb).then((ret: NullishType): void => { 432 if (ret === null || ret === undefined) { 433 let err: BusinessError<string> = { 434 code: -1, 435 data: "Operation failed", 436 name: "", 437 message: "" 438 }; 439 reject(err); 440 } else { 441 resolve(ret as PromiseLike<void>); 442 } 443 }); 444 }); 445 } 446 447 setHidden(hiddenState: boolean, callback: AsyncCallback<void, void>): void { 448 let task = new taskpool.Task(() =>this.setHiddenSync(hiddenState)); 449 let p1 = taskpool.execute(task); 450 p1.then((ret: NullishType) => { 451 let eNull: BusinessError<void> = { 452 code: -1, 453 name: "", 454 message: "" 455 }; 456 if (ret === null || ret === undefined) { 457 eNull.code = -1; 458 callback(eNull, undefined); 459 } else { 460 eNull.code = 0; 461 callback(eNull, undefined); 462 } 463 }); 464 } 465 466 setUserComment(userComment: string): Promise<void> { 467 return new Promise<void>((resolve: (v: PromiseLike<void>) => void, reject: RejectString) => { 468 let cb = (): PromiseLike<void> => { this.setUserCommentSync(userComment) }; 469 taskpool.execute(cb).then((ret: NullishType): void => { 470 if (ret === null || ret === undefined) { 471 let err: BusinessError<string> = { 472 code: -1, 473 data: "Operation failed", 474 name: "", 475 message: "" 476 }; 477 reject(err); 478 } else { 479 resolve(ret as PromiseLike<void>); 480 } 481 }); 482 }); 483 } 484 485 setUserComment(userComment: string, callback: AsyncCallback<void, void>): void { 486 let task = new taskpool.Task(() =>this.setUserCommentSync(userComment)); 487 let p1 = taskpool.execute(task); 488 p1.then((ret: NullishType) => { 489 let eNull: BusinessError<void> = { 490 code: -1, 491 name: "", 492 message: "" 493 }; 494 if (ret === null || ret === undefined) { 495 eNull.code = -1; 496 callback(eNull, undefined); 497 } else { 498 eNull.code = 0; 499 callback(eNull, undefined); 500 } 501 }); 502 } 503 504 getAnalysisData(analysisType: AnalysisType): Promise<string> { 505 return new Promise<string>((resolve: (v: string) => void, reject: RejectString) => { 506 let cb = (): string => { return this.getAnalysisDataSync(analysisType) }; 507 taskpool.execute(cb).then((ret: NullishType): void => { 508 if (ret === null || ret === undefined) { 509 let err: BusinessError<string> = { 510 code: -1, 511 data: "Operation failed", 512 name: "", 513 message: "" 514 }; 515 reject(err); 516 } else { 517 resolve(ret as string); 518 } 519 }); 520 }); 521 } 522 523 getAnalysisData(analysisType: AnalysisType, callback: AsyncCallback<string | undefined, void>): void { 524 let task = new taskpool.Task(() =>this.getAnalysisDataSync(analysisType)); 525 let p1 = taskpool.execute(task); 526 p1.then((ret: NullishType) => { 527 let eNull: BusinessError<void> = { 528 code: -1, 529 name: "", 530 message: "" 531 }; 532 if (ret === null || ret === undefined) { 533 eNull.code = -1; 534 callback(eNull, undefined); 535 } else { 536 let result = ret as string; 537 eNull.code = 0; 538 callback(eNull, result); 539 } 540 }); 541 } 542 } 543 544 545 export enum PhotoKeys { 546 URI = 'uri', 547 PHOTO_TYPE = 'media_type', 548 DISPLAY_NAME = 'display_name', 549 SIZE = 'size', 550 DATE_ADDED = 'date_added', 551 DATE_MODIFIED = 'date_modified', 552 DURATION = 'duration', 553 WIDTH = 'width', 554 HEIGHT = 'height', 555 DATE_TAKEN = 'date_taken', 556 ORIENTATION = 'orientation', 557 FAVORITE = 'is_favorite', 558 TITLE = 'title', 559 POSITION = 'position', 560 DATE_TRASHED = 'date_trashed', 561 HIDDEN = 'hidden', 562 USER_COMMENT = 'user_comment', 563 CAMERA_SHOT_KEY = 'camera_shot_key', 564 DATE_YEAR = 'date_year', 565 DATE_MONTH = 'date_month', 566 DATE_DAY = 'date_day', 567 PENDING = 'pending', 568 DATE_ADDED_MS = 'date_added_ms', 569 DATE_MODIFIED_MS = 'date_modified_ms', 570 DATE_TRASHED_MS = 'date_trashed_ms', 571 PHOTO_SUBTYPE = 'subtype', 572 MOVING_PHOTO_EFFECT_MODE = 'moving_photo_effect_mode', 573 DYNAMIC_RANGE_TYPE = 'dynamic_range_type', 574 COVER_POSITION = 'cover_position', 575 BURST_KEY = 'burst_key', 576 THUMBNAIL_READY = 'thumbnail_ready', 577 LCD_SIZE = 'lcd_size', 578 THM_SIZE = 'thm_size', 579 DETAIL_TIME = 'detail_time', 580 DATE_TAKEN_MS = 'date_taken_ms', 581 CE_AVAILABLE = 'ce_available', 582 SUPPORTED_WATERMARK_TYPE = 'supported_watermark_type' 583 } 584 585 export enum AlbumKeys { 586 URI = 'uri', 587 ALBUM_NAME = 'album_name' 588 } 589 590 export enum HiddenPhotosDisplayMode { 591 ASSETS_MODE, 592 ALBUMS_MODE 593 } 594 595 export interface FetchOptions { 596 fetchColumns: Array<string>; 597 predicates: dataSharePredicates.DataSharePredicates; 598 } 599 600 export interface PhotoCreateOptions { 601 subtype?: PhotoSubtype; 602 cameraShotKey?: string; 603 } 604 605 export interface PhotoCreationConfig { 606 title?: string; 607 fileNameExtension: string; 608 photoType: PhotoType; 609 subtype?: PhotoSubtype; 610 } 611 612 export interface CreateOptions { 613 title?: string; 614 subtype?: PhotoSubtype; 615 } 616 617 export interface RequestPhotoOptions { 618 size?: image.Size; 619 requestPhotoType?: RequestPhotoType; 620 } 621 622 export interface FetchResult<T> { 623 getCount(): number; 624 isAfterLast(): boolean; 625 getFirstObject(callback: AsyncCallback<T | undefined>): void; 626 getFirstObject(): Promise<T>; 627 getNextObject(callback: AsyncCallback<T | undefined>): void; 628 getNextObject(): Promise<T>; 629 getAllObjects(callback: AsyncCallback<Array<T> | undefined>): void; 630 getAllObjects(): Promise<Array<T>>; 631 close(): void; 632 } 633 634 class FetchResultHandle<T> implements FetchResult<T> { 635 private nativeValue: long = 0; 636 637 constructor(value: long) { 638 this.nativeValue = value; 639 } 640 native getCount(): number; 641 native getFirstObjectSync(): T; 642 native getNextObjectSync(): T; 643 native getAllObjectsSync(): Array<T>; 644 native close(): void; 645 646 isAfterLast(): boolean { 647 return false; 648 } 649 getFirstObject(callback: AsyncCallback<T | undefined>): void {} 650 getFirstObject(): Promise<T> { 651 return new Promise<T>((resolve: (v: T) => void, reject: RejectString) => { 652 let cb = (): T => { return this.getFirstObjectSync() }; 653 taskpool.execute(cb).then((ret: NullishType): void => { 654 if (ret === null || ret === undefined) { 655 let err: BusinessError<string> = { 656 code: -1, 657 data: "Operation failed", 658 name: "", 659 message: "" 660 }; 661 reject(err); 662 } else { 663 let result = ret as T; 664 resolve(result); 665 } 666 }); 667 }); 668 } 669 670 getNextObject(callback: AsyncCallback<T | undefined>): void {} 671 getNextObject(): Promise<T> { 672 return new Promise<T>((resolve: (v: T) => void, reject: RejectString) => { 673 let cb = (): T => { return this.getNextObjectSync() }; 674 taskpool.execute(cb).then((ret: NullishType): void => { 675 if (ret === null || ret === undefined) { 676 let err: BusinessError<string> = { 677 code: -1, 678 data: "Operation failed", 679 name: "", 680 message: "" 681 }; 682 reject(err); 683 } else { 684 let result = ret as T; 685 resolve(result); 686 } 687 }); 688 }); 689 } 690 691 getAllObjects(callback: AsyncCallback<Array<T> | undefined, void>): void { 692 let task = new taskpool.Task(() => this.getAllObjectsSync()); 693 let p1 = taskpool.execute(task); 694 p1.then((ret: NullishType) => { 695 let eNull: BusinessError<void> = { 696 code: -1, 697 name: "", 698 message: "" 699 }; 700 if (ret === null || ret === undefined) { 701 eNull.code = -1; 702 callback(eNull, undefined); 703 } else { 704 let result = ret as Array<T>; 705 eNull.code = 0; 706 callback(eNull, result); 707 } 708 }); 709 } 710 getAllObjects(): Promise<Array<T>> { 711 return new Promise<Array<T>>((resolve: (v: Array<T>) => void, reject: RejectString) => { 712 let blockQueue: BlockingQueue<Array<T>> = new ArrayBlockingQueue<Array<T>>(2); 713 let cb = (): Array<T> => { 714 let result = this.getAllObjectsSync() 715 blockQueue.push(result) 716 return result 717 }; 718 719 taskpool.execute(cb).then((ret: NullishType): void => { 720 if (ret === null || ret === undefined) { 721 let err: BusinessError<string> = { 722 code: -1, 723 data: "Operation failed", 724 name: "", 725 message: "" 726 }; 727 reject(err); 728 } else { 729 let result = ret as Array<T>; 730 resolve(result); 731 } 732 }); 733 734 blockQueue.pop(); 735 }); 736 } 737 } 738 739 export enum AlbumType { 740 USER = 0, 741 SYSTEM = 1024, 742 SMART = 4096 743 } 744 745 export enum AlbumSubtype { 746 USER_GENERIC = 1, 747 FAVORITE = 1025, 748 VIDEO, 749 HIDDEN, 750 TRASH, 751 SCREENSHOT, 752 CAMERA, 753 IMAGE = 1031, 754 CLOUD_ENHANCEMENT = 1032, 755 SOURCE_GENERIC = 2049, 756 CLASSIFY = 4097, 757 GEOGRAPHY_LOCATION = 4099, 758 GEOGRAPHY_CITY, 759 SHOOTING_MODE, 760 PORTRAIT, 761 GROUP_PHOTO, 762 HIGHLIGHT = 4104, 763 HIGHLIGHT_SUGGESTIONS, 764 ANY = 2147483647 765 } 766 767 export enum RequestPhotoType { 768 REQUEST_ALL_THUMBNAILS = 0, 769 REQUEST_FAST_THUMBNAIL, 770 REQUEST_QUALITY_THUMBNAIL 771 } 772 773 export interface AbsAlbum { 774 readonly albumType: AlbumType; 775 readonly albumSubtype: AlbumSubtype; 776 albumName: string; 777 readonly albumUri: string; 778 readonly count: number; 779 readonly coverUri: string; 780 781 getAssets(options: FetchOptions, callback: AsyncCallback<FetchResult<PhotoAsset> | undefined>): void; 782 getAssets(options: FetchOptions): Promise<FetchResult<PhotoAsset>>; 783 getSharedPhotoAssets(options: FetchOptions): Array<SharedPhotoAsset>; 784 } 785 786 export interface Album extends AbsAlbum { 787 readonly imageCount?: number; 788 readonly videoCount?: number; 789 790 commitModify(callback: AsyncCallback<void>): void; 791 commitModify(): Promise<void>; 792 addAssets(assets: Array<PhotoAsset>, callback: AsyncCallback<void>): void; 793 addAssets(assets: Array<PhotoAsset>): Promise<void>; 794 removeAssets(assets: Array<PhotoAsset>, callback: AsyncCallback<void>): void; 795 removeAssets(assets: Array<PhotoAsset>): Promise<void>; 796 recoverAssets(assets: Array<PhotoAsset>, callback: AsyncCallback<void>): void; 797 recoverAssets(assets: Array<PhotoAsset>): Promise<void>; 798 deleteAssets(assets: Array<PhotoAsset>, callback: AsyncCallback<void>): void; 799 deleteAssets(assets: Array<PhotoAsset>): Promise<void>; 800 setCoverUri(uri: string, callback: AsyncCallback<void>): void; 801 setCoverUri(uri: string): Promise<void>; 802 getFaceId(): Promise<string>; 803 } 804 805 class AlbumHandle implements Album { 806 readonly albumType: AlbumType; 807 readonly albumSubtype: AlbumSubtype; 808 albumName: string = ''; 809 readonly albumUri: string = ''; 810 readonly count: number; 811 readonly coverUri: string = ''; 812 readonly imageCount: number | undefined = undefined; 813 readonly videoCount: number | undefined = undefined; 814 private nativePhotoAlbum: long = 0; 815 816 constructor(nativePtr: long) { 817 if (this.nativePhotoAlbum == 0) { 818 this.nativePhotoAlbum = nativePtr; 819 this.imageCount = this.getImageCount(); 820 this.videoCount = this.getVideoCount(); 821 } 822 } 823 824 getAssets(options: FetchOptions, callback: AsyncCallback<FetchResult<PhotoAsset> | undefined>): void { 825 let cb = (): MediaLibraryAniError | FetchResult<PhotoAsset> => { 826 try { 827 return this.getAssetsInner(options); 828 } catch(e) { 829 return e as MediaLibraryAniError; 830 } 831 }; 832 taskpool.execute(cb).then((ret: NullishType): void => { 833 if (ret instanceof MediaLibraryAniError) { 834 let err = ret as MediaLibraryAniError; 835 callback(businessError(err.code, err.message), undefined); 836 } else { 837 if (isNullish(ret)) { 838 callback(businessError(-1, "Operation failed"), undefined); 839 } else { 840 callback(businessError(0), ret as FetchResult<PhotoAsset>); 841 } 842 } 843 }); 844 } 845 846 getAssets(options: FetchOptions): Promise<FetchResult<PhotoAsset>> { 847 return new Promise<FetchResult<PhotoAsset>>((resolve: (v: FetchResult<PhotoAsset>) => void, 848 reject: RejectString) => { 849 let cb = (): FetchResult<PhotoAsset> | MediaLibraryAniError => { 850 try { 851 return this.getAssetsInner(options); 852 } catch(e) { 853 return e as MediaLibraryAniError; 854 } 855 }; 856 taskpool.execute(cb).then((ret: NullishType): void => { 857 if (ret instanceof MediaLibraryAniError) { 858 let err = ret as MediaLibraryAniError; 859 reject(businessError<string>(err.code, err.message)); 860 } else { 861 if (isNullish(ret)) { 862 reject(businessError<string>(-1, "Operation failed")); 863 } else { 864 resolve(ret as FetchResult<PhotoAsset>); 865 } 866 } 867 }); 868 }); 869 } 870 871 getSharedPhotoAssets(options: FetchOptions): Array<SharedPhotoAsset> { 872 return new Array<SharedPhotoAsset>(); 873 } 874 875 commitModify(callback: AsyncCallback<void>): void { 876 let cb = (): MediaLibraryAniError | undefined => { 877 try { 878 this.commitModifyInner(); 879 return undefined; 880 } catch(e) { 881 return e as MediaLibraryAniError; 882 } 883 } 884 taskpool.execute(cb).then((ret: NullishType): void => { 885 if (isNullish(ret)) { 886 callback(businessError(0), undefined); 887 } else { 888 let err = ret as MediaLibraryAniError; 889 callback(businessError(err.code, err.message), undefined); 890 } 891 }); 892 } 893 894 commitModify(): Promise<void> { 895 return new Promise<void>((resolve: (v: undefined) => void, reject: (e: BusinessError<void>) => void): void => { 896 let cb = (): MediaLibraryAniError | undefined => { 897 try { 898 this.commitModifyInner(); 899 return undefined; 900 } catch(e) { 901 return e as MediaLibraryAniError; 902 } 903 }; 904 taskpool.execute(cb).then((ret: NullishType): void => { 905 if (isNullish(ret)) { 906 resolve(undefined); 907 } else { 908 let err = ret as MediaLibraryAniError; 909 reject(businessError(err.code, err.message)); 910 } 911 }); 912 }); 913 } 914 915 addAssets(assets: Array<PhotoAsset>, callback: AsyncCallback<void>): void { 916 let cb = (): MediaLibraryAniError | undefined => { 917 try { 918 this.addAssetsInner(assets); 919 return undefined; 920 } catch(e) { 921 return e as MediaLibraryAniError; 922 } 923 } 924 taskpool.execute(cb).then((ret: NullishType): void => { 925 if (isNullish(ret)) { 926 callback(businessError(0), undefined); 927 } else { 928 let err = ret as MediaLibraryAniError; 929 callback(businessError(err.code, err.message), undefined); 930 } 931 }); 932 } 933 934 addAssets(assets: Array<PhotoAsset>): Promise<void> { 935 return new Promise<void>((resolve: (v: undefined) => void, reject: (e: BusinessError<void>) => void): void => { 936 let cb = (): MediaLibraryAniError | undefined => { 937 try { 938 this.addAssetsInner(assets); 939 return undefined; 940 } catch(e) { 941 return e as MediaLibraryAniError; 942 } 943 }; 944 taskpool.execute(cb).then((ret: NullishType): void => { 945 if (isNullish(ret)) { 946 resolve(undefined); 947 } else { 948 let err = ret as MediaLibraryAniError; 949 reject(businessError(err.code, err.message)); 950 } 951 }); 952 }); 953 } 954 955 removeAssets(assets: Array<PhotoAsset>, callback: AsyncCallback<void>): void { 956 let cb = (): MediaLibraryAniError | undefined => { 957 try { 958 this.removeAssetsInner(assets); 959 return undefined; 960 } catch(e) { 961 return e as MediaLibraryAniError; 962 } 963 } 964 taskpool.execute(cb).then((ret: NullishType): void => { 965 if (isNullish(ret)) { 966 callback(businessError(0), undefined); 967 } else { 968 let err = ret as MediaLibraryAniError; 969 callback(businessError(err.code, err.message), undefined); 970 } 971 }); 972 } 973 974 removeAssets(assets: Array<PhotoAsset>): Promise<void> { 975 return new Promise<void>((resolve: (v: undefined) => void, reject: (e: BusinessError<void>) => void): void => { 976 let cb = (): MediaLibraryAniError | undefined => { 977 try { 978 this.removeAssetsInner(assets); 979 return undefined; 980 } catch(e) { 981 return e as MediaLibraryAniError; 982 } 983 }; 984 taskpool.execute(cb).then((ret: NullishType): void => { 985 if (isNullish(ret)) { 986 resolve(undefined); 987 } else { 988 let err = ret as MediaLibraryAniError; 989 reject(businessError(err.code, err.message)); 990 } 991 }); 992 }); 993 } 994 995 recoverAssets(assets: Array<PhotoAsset>, callback: AsyncCallback<void>): void { 996 let cb = (): MediaLibraryAniError | undefined => { 997 try { 998 this.recoverAssetsInner(assets); 999 return undefined; 1000 } catch(e) { 1001 return e as MediaLibraryAniError; 1002 } 1003 } 1004 taskpool.execute(cb).then((ret: NullishType): void => { 1005 if (isNullish(ret)) { 1006 callback(businessError(0), undefined); 1007 } else { 1008 let err = ret as MediaLibraryAniError; 1009 callback(businessError(err.code, err.message), undefined); 1010 } 1011 }); 1012 } 1013 1014 recoverAssets(assets: Array<PhotoAsset>): Promise<void> { 1015 return new Promise<void>((resolve: (v: undefined) => void, reject: (e: BusinessError<void>) => void): void => { 1016 let cb = (): MediaLibraryAniError | undefined => { 1017 try { 1018 this.recoverAssetsInner(assets); 1019 return undefined; 1020 } catch(e) { 1021 return e as MediaLibraryAniError; 1022 } 1023 }; 1024 taskpool.execute(cb).then((ret: NullishType): void => { 1025 if (isNullish(ret)) { 1026 resolve(undefined); 1027 } else { 1028 let err = ret as MediaLibraryAniError; 1029 reject(businessError(err.code, err.message)); 1030 } 1031 }); 1032 }); 1033 } 1034 1035 deleteAssets(assets: Array<PhotoAsset>, callback: AsyncCallback<void>): void { 1036 let cb = (): MediaLibraryAniError | undefined => { 1037 try { 1038 this.deleteAssetsInner(assets); 1039 return undefined; 1040 } catch(e) { 1041 return e as MediaLibraryAniError; 1042 } 1043 } 1044 taskpool.execute(cb).then((ret: NullishType): void => { 1045 if (isNullish(ret)) { 1046 callback(businessError(0), undefined); 1047 } else { 1048 let err = ret as MediaLibraryAniError; 1049 callback(businessError(err.code, err.message), undefined); 1050 } 1051 }); 1052 } 1053 1054 deleteAssets(assets: Array<PhotoAsset>): Promise<void> { 1055 return new Promise<void>((resolve: (v: undefined) => void, reject: (e: BusinessError<void>) => void): void => { 1056 let cb = (): MediaLibraryAniError | undefined => { 1057 try { 1058 this.deleteAssetsInner(assets); 1059 return undefined; 1060 } catch(e) { 1061 return e as MediaLibraryAniError; 1062 } 1063 }; 1064 taskpool.execute(cb).then((ret: NullishType): void => { 1065 if (isNullish(ret)) { 1066 resolve(undefined); 1067 } else { 1068 let err = ret as MediaLibraryAniError; 1069 reject(businessError(err.code, err.message)); 1070 } 1071 }); 1072 }); 1073 } 1074 1075 setCoverUri(uri: string, callback: AsyncCallback<void>): void { 1076 let cb = (): MediaLibraryAniError | undefined => { 1077 try { 1078 this.setCoverUriInner(uri); 1079 return undefined; 1080 } catch(e) { 1081 return e as MediaLibraryAniError; 1082 } 1083 } 1084 taskpool.execute(cb).then((ret: NullishType): void => { 1085 if (isNullish(ret)) { 1086 callback(businessError(0), undefined); 1087 } else { 1088 let err = ret as MediaLibraryAniError; 1089 callback(businessError(err.code, err.message), undefined); 1090 } 1091 }); 1092 } 1093 1094 setCoverUri(uri: string): Promise<void> { 1095 return new Promise<void>((resolve: (v: undefined) => void, reject: (e: BusinessError<void>) => void): void => { 1096 let cb = (): MediaLibraryAniError | undefined => { 1097 try { 1098 this.setCoverUriInner(uri); 1099 return undefined; 1100 } catch(e) { 1101 return e as MediaLibraryAniError; 1102 } 1103 }; 1104 taskpool.execute(cb).then((ret: NullishType): void => { 1105 if (isNullish(ret)) { 1106 resolve(undefined); 1107 } else { 1108 let err = ret as MediaLibraryAniError; 1109 reject(businessError(err.code, err.message)); 1110 } 1111 }); 1112 }); 1113 } 1114 1115 getFaceId(): Promise<string> { 1116 return new Promise<string>((resolve: (v: string) => void, reject: RejectString) => { 1117 let cb = (): string | MediaLibraryAniError => { 1118 try { 1119 return this.getFaceIdInner(); 1120 } catch(e) { 1121 return e as MediaLibraryAniError; 1122 } 1123 }; 1124 taskpool.execute(cb).then((ret: NullishType): void => { 1125 if (ret instanceof MediaLibraryAniError) { 1126 let err = ret as MediaLibraryAniError; 1127 reject(businessError<string>(err.code, err.message)); 1128 } else { 1129 if (isNullish(ret)) { 1130 reject(businessError<string>(-1, "Operation failed")); 1131 } else { 1132 resolve(ret as string); 1133 } 1134 } 1135 }); 1136 }); 1137 } 1138 1139 native getAssetsInner(options: FetchOptions): FetchResult<PhotoAsset>; 1140 native getAssetsSync(options: FetchOptions): Array<PhotoAsset>; 1141 native commitModifyInner(): void; 1142 native addAssetsInner(assets: Array<PhotoAsset>): void; 1143 native removeAssetsInner(assets: Array<PhotoAsset>): void; 1144 native recoverAssetsInner(assets: Array<PhotoAsset>): void; 1145 native deleteAssetsInner(assets: Array<PhotoAsset>): void; 1146 native setCoverUriInner(uri: string): void; 1147 native getFaceIdInner(): string; 1148 native getImageCount(): number; 1149 native getVideoCount(): number; 1150 } 1151 1152 export interface PhotoAccessHelper { 1153 getAssets(options: FetchOptions, callback: AsyncCallback<FetchResult<PhotoAsset> | undefined>): void; 1154 getAssets(options: FetchOptions): Promise<FetchResult<PhotoAsset>>; 1155 getAssetsSync(options: FetchOptions): Array<PhotoAsset>; 1156 getFileAssetsInfo(options: FetchOptions): Array<FileAssetInfo>; 1157 getAlbums(type: AlbumType, subtype: AlbumSubtype, options: FetchOptions): Promise<FetchResult<Album>>; 1158 stopThumbnailCreationTask(taskId: number): void; 1159 startCreateThumbnailTask(predicate: dataSharePredicates.DataSharePredicates): int; 1160 getBurstAssets(burstKey: string, options: FetchOptions): Promise<FetchResult<PhotoAsset>>; 1161 createAsset(displayName: string, callback: AsyncCallback<PhotoAsset | undefined>): void; 1162 createAsset(displayName: string): Promise<PhotoAsset>; 1163 createAsset(displayName: string, options: PhotoCreateOptions): Promise<PhotoAsset>; 1164 createAsset(displayName: string, options: PhotoCreateOptions, 1165 callback: AsyncCallback<PhotoAsset | undefined>): void; 1166 createAsset(photoType: PhotoType, extension: string, options: CreateOptions, 1167 callback: AsyncCallback<string | undefined>): void; 1168 createAsset(photoType: PhotoType, extension: string, callback: AsyncCallback<string | undefined>): void; 1169 createAsset(photoType: PhotoType, extension: string, options?: CreateOptions): Promise<string>; 1170 } 1171 1172 class PhotoAccessHelperHandle implements PhotoAccessHelper { 1173 private nativePhotoAccessHelper: long = 0; 1174 1175 constructor(nativePtr: long) { 1176 if (this.nativePhotoAccessHelper == 0) { 1177 this.nativePhotoAccessHelper = nativePtr; 1178 } 1179 } 1180 1181 getAssets(options: FetchOptions, callback: AsyncCallback<FetchResult<PhotoAsset> | undefined>): void { 1182 let cb = (): MediaLibraryAniError | FetchResult<PhotoAsset> => { 1183 try { 1184 return this.getAssetsInner(options); 1185 } catch(e) { 1186 return e as MediaLibraryAniError; 1187 } 1188 }; 1189 taskpool.execute(cb).then((ret: NullishType): void => { 1190 if (ret instanceof MediaLibraryAniError) { 1191 let err = ret as MediaLibraryAniError; 1192 callback(businessError(err.code, err.message), undefined); 1193 } else { 1194 if (isNullish(ret)) { 1195 callback(businessError(-1, "Operation failed"), undefined); 1196 } else { 1197 callback(businessError(0), ret as FetchResult<PhotoAsset>); 1198 } 1199 } 1200 }); 1201 } 1202 1203 getAssets(options: FetchOptions): Promise<FetchResult<PhotoAsset>> { 1204 return new Promise<FetchResult<PhotoAsset>>((resolve: (v: FetchResult<PhotoAsset>) => void, reject: RejectString) => { 1205 let blockQueue: BlockingQueue<FetchResult<PhotoAsset>> = new ArrayBlockingQueue<FetchResult<PhotoAsset>>(2); 1206 let cb = (): FetchResult<PhotoAsset> => { 1207 let result = this.getAssetsInner(options) 1208 blockQueue.push(result) 1209 return result 1210 }; 1211 1212 taskpool.execute(cb).then((buffer: NullishType): void => { 1213 if (buffer === null || buffer === undefined) { 1214 let error: BusinessError<string> = { 1215 code: -1, 1216 data: "Operation failed", 1217 name: "", 1218 message: "" 1219 }; 1220 reject(error); 1221 } else { 1222 resolve(buffer as FetchResult<PhotoAsset>); 1223 } 1224 }); 1225 1226 blockQueue.pop(); 1227 }); 1228 } 1229 1230 getAlbums(type: AlbumType, subtype: AlbumSubtype, options: FetchOptions): Promise<FetchResult<Album>> { 1231 return new Promise<FetchResult<Album>>((resolve: (v: FetchResult<Album>) => void, reject: RejectString) => { 1232 let cb = (): FetchResult<Album> => { return this.getAlbumsInner(type, subtype, options) }; 1233 taskpool.execute(cb).then((buffer: NullishType): void => { 1234 if (buffer === null || buffer === undefined) { 1235 let error: BusinessError<string> = { 1236 code: -1, 1237 data: "Operation failed", 1238 name: "", 1239 message: "" 1240 }; 1241 reject(error); 1242 } else { 1243 resolve(buffer as FetchResult<Album>); 1244 } 1245 }); 1246 }); 1247 } 1248 1249 getBurstAssets(burstKey: string, options: FetchOptions): Promise<FetchResult<PhotoAsset>> { 1250 return new Promise<FetchResult<PhotoAsset>>((resolve: (v: FetchResult<PhotoAsset>) => void, 1251 reject: RejectString) => { 1252 let emptyResult: FetchResult<PhotoAsset> = new FetchResultHandle<PhotoAsset>(0); 1253 resolve(emptyResult); 1254 }); 1255 } 1256 1257 createAsset(displayName: string, callback: AsyncCallback<PhotoAsset | undefined>): void {} 1258 1259 createAsset(displayName: string): Promise<PhotoAsset> { 1260 return new Promise<PhotoAsset>((resolve: (v: PhotoAsset) => void, reject: (e: BusinessError<string>) => void) => { 1261 let emptyResult: PhotoAsset = new PhotoAssetHandle(0); 1262 resolve(emptyResult); 1263 }); 1264 } 1265 1266 createAsset(displayName: string, options: PhotoCreateOptions): Promise<PhotoAsset> { 1267 return new Promise<PhotoAsset>((resolve: (v: PhotoAsset) => void, reject: (e: BusinessError<string>) => void) => { 1268 let emptyResult: PhotoAsset = new PhotoAssetHandle(0); 1269 resolve(emptyResult); 1270 }); 1271 } 1272 1273 createAsset(displayName: string, options: PhotoCreateOptions, 1274 callback: AsyncCallback<PhotoAsset | undefined>): void {} 1275 1276 createAsset(photoType: PhotoType, extension: string, options: CreateOptions, 1277 callback: AsyncCallback<string | undefined>): void {} 1278 1279 createAsset(photoType: PhotoType, extension: string, callback: AsyncCallback<string | undefined>): void {} 1280 1281 createAsset(photoType: PhotoType, extension: string, options?: CreateOptions): Promise<string> { 1282 return new Promise<string>((resolve: (v: string) => void, reject: (e: BusinessError<string>) => void) => { 1283 let emptyResult: string = ""; 1284 resolve(emptyResult); 1285 }); 1286 } 1287 1288 native getAlbumsInner(type: AlbumType, subtype: AlbumSubtype, options: FetchOptions): FetchResult<Album>; 1289 native release(): void; 1290 native applyChanges(mediaChangeRequest: MediaChangeRequest): void; 1291 native createAsset1(displayName: string): PhotoAsset; 1292 native getAssetsSync(options: FetchOptions): Array<PhotoAsset>; 1293 native getFileAssetsInfo(options: FetchOptions): Array<FileAssetInfo>; 1294 native getAssetsInner(options: FetchOptions): FetchResult<PhotoAsset>; 1295 native stopThumbnailCreationTask(taskId: number): void; 1296 native startCreateThumbnailTask(predicate: dataSharePredicates.DataSharePredicates): int; 1297 } 1298 1299 export interface FormInfo { 1300 formId: string; 1301 uri: string; 1302 } 1303 1304 export enum NotifyType { 1305 NOTIFY_ADD, 1306 NOTIFY_UPDATE, 1307 NOTIFY_REMOVE, 1308 NOTIFY_ALBUM_ADD_ASSET, 1309 NOTIFY_ALBUM_REMOVE_ASSET 1310 } 1311 1312 export enum DefaultChangeUri { 1313 DEFAULT_PHOTO_URI = 'file://media/Photo', 1314 DEFAULT_ALBUM_URI = 'file://media/PhotoAlbum', 1315 DEFAULT_HIDDEN_ALBUM_URI = 'file://media/HiddenAlbum' 1316 } 1317 1318 export interface ChangeData { 1319 type: NotifyType; 1320 uris: Array<string>; 1321 extraUris: Array<string>; 1322 } 1323 1324 class ChangeDataHandle implements ChangeData { 1325 constructor() {} 1326 type: NotifyType; 1327 uris: Array<string> = new Array<string>(); 1328 extraUris: Array<string> = new Array<string>(); 1329 } 1330 1331 export enum PhotoViewMIMETypes { 1332 IMAGE_TYPE = 'image/*', 1333 VIDEO_TYPE = 'video/*', 1334 IMAGE_VIDEO_TYPE = '*/*', 1335 MOVING_PHOTO_IMAGE_TYPE = 'image/movingPhoto' 1336 } 1337 1338 export class BaseSelectOptions { 1339 MIMEType: PhotoViewMIMETypes | undefined; 1340 maxSelectNumber: number | undefined; 1341 isSearchSupported: boolean | undefined; 1342 isPhotoTakingSupported: boolean | undefined; 1343 recommendationOptions: RecommendationOptions | undefined; 1344 preselectedUris: Array<string> | undefined; 1345 isPreviewForSingleSelectionSupported: boolean | undefined; 1346 } 1347 1348 export class PhotoSelectOptions extends BaseSelectOptions { 1349 isEditSupported: boolean | undefined; 1350 isOriginalSupported: boolean | undefined; 1351 subWindowName: string | undefined; 1352 themeColor: undefined; 1353 completeButtonText: CompleteButtonText | undefined; 1354 } 1355 1356 export class RecommendationOptions { 1357 recommendationType: RecommendationType | undefined; 1358 textContextInfo: TextContextInfo | undefined; 1359 } 1360 1361 export interface TextContextInfo { 1362 text?: string; 1363 } 1364 1365 export class PhotoSelectResult { 1366 photoUris: Array<string> = new Array<string>(); 1367 isOriginalPhoto: boolean = false; 1368 } 1369 1370 export class PhotoViewPicker { 1371 } 1372 1373 export class MediaAssetEditData { 1374 constructor(compatibleFormat: string, formatVersion: string) { 1375 this.compatibleFormat = compatibleFormat; 1376 this.formatVersion = formatVersion; 1377 } 1378 compatibleFormat: string; 1379 formatVersion: string; 1380 data: string; 1381 } 1382 1383 export enum ResourceType { 1384 IMAGE_RESOURCE = 1, 1385 VIDEO_RESOURCE = 2, 1386 PHOTO_PROXY = 3, 1387 PRIVATE_MOVING_PHOTO_RESOURCE = 4 1388 } 1389 1390 export enum ImageFileType { 1391 JPEG = 1, 1392 HEIF = 2 1393 } 1394 1395 export enum MovingPhotoEffectMode { 1396 DEFAULT = 0, 1397 BOUNCE_PLAY = 1, 1398 LOOP_PLAY = 2, 1399 LONG_EXPOSURE = 3, 1400 MULTI_EXPOSURE = 4, 1401 CINEMA_GRAPH = 5, 1402 IMAGE_ONLY = 10 1403 } 1404 1405 export enum VideoEnhancementType { 1406 QUALITY_ENHANCEMENT_LOCAL = 0, 1407 QUALITY_ENHANCEMENT_CLOUD = 1, 1408 QUALITY_ENHANCEMENT_LOCAL_AND_CLOUD = 2 1409 } 1410 1411 export interface MediaChangeRequest {} 1412 1413 export class MediaAssetChangeRequest implements MediaChangeRequest { 1414 constructor(asset: PhotoAsset) {} 1415 } 1416 1417 export class MediaAssetsChangeRequest implements MediaChangeRequest { 1418 private assets: Array<PhotoAsset>; 1419 1420 constructor(assets: Array<PhotoAsset>) { 1421 this.assets = assets; 1422 } 1423 1424 setFavorite(favoriteState: boolean): void {} 1425 1426 setHidden(hiddenState: boolean): void {} 1427 1428 setUserComment(userComment: string): void {} 1429 } 1430 1431 export class MediaAlbumChangeRequest implements MediaChangeRequest { 1432 constructor(album: Album) {} 1433 } 1434 1435 export interface SharedPhotoAsset { 1436 fileId: number; 1437 uri: string; 1438 data: string; 1439 mediaType: PhotoType; 1440 displayName: string; 1441 size: number; 1442 dateAdded: number; 1443 dateModified: number; 1444 duration: number; 1445 width: number; 1446 height: number; 1447 dateTaken: number; 1448 orientation: number; 1449 isFavorite: boolean; 1450 title: string; 1451 position: PositionType; 1452 dateTrashed: number; 1453 hidden: boolean; 1454 userComment: string; 1455 cameraShotKey: string; 1456 dateYear: string; 1457 dateMonth: string; 1458 dateDay: string; 1459 pending: boolean; 1460 dateAddedMs: number; 1461 dateModifiedMs: number; 1462 dateTrashedMs: number; 1463 subtype: PhotoSubtype; 1464 movingPhotoEffectMode: MovingPhotoEffectMode; 1465 dynamicRangeType: DynamicRangeType; 1466 thumbnailReady: boolean; 1467 lcdSize: string; 1468 thmSize: string; 1469 } 1470 1471 export interface MovingPhoto { 1472 requestContent(imageFileUri: string, videoFileUri: string): Promise<void>; 1473 requestContent(resourceType: ResourceType, fileUri: string): Promise<void>; 1474 requestContent(resourceType: ResourceType): Promise<ArrayBuffer>; 1475 getUri(): string; 1476 } 1477 1478 export interface FileAssetInfo { 1479 file_id: number; 1480 uri: string; 1481 media_type: PhotoType; 1482 display_name: string; 1483 size: number; 1484 date_added: number; 1485 date_modified: number; 1486 duration: number; 1487 width: number; 1488 height: number; 1489 date_taken: number; 1490 orientation: number; 1491 is_favorite: boolean; 1492 title: string; 1493 position: PositionType; 1494 date_trashed: number; 1495 hidden: boolean; 1496 user_comment: string; 1497 camera_shot_key: string; 1498 date_year: string; 1499 date_month: string; 1500 date_day: string; 1501 pending: boolean; 1502 date_added_ms: number; 1503 date_modified_ms: number; 1504 date_trashed_ms: number; 1505 subtype: PhotoSubtype; 1506 } 1507 1508 class FileAssetInfoHandle implements FileAssetInfo { 1509 file_id: number; 1510 uri: string = ""; 1511 media_type: PhotoType; 1512 display_name: string = ""; 1513 size: number; 1514 date_added: number; 1515 date_modified: number; 1516 duration: number; 1517 width: number; 1518 height: number; 1519 date_taken: number; 1520 orientation: number; 1521 is_favorite: boolean; 1522 title: string = ""; 1523 position: PositionType; 1524 date_trashed: number; 1525 hidden: boolean; 1526 user_comment: string = ""; 1527 camera_shot_key: string = ""; 1528 date_year: string = ""; 1529 date_month: string = ""; 1530 date_day: string = ""; 1531 pending: boolean; 1532 date_added_ms: number; 1533 date_modified_ms: number; 1534 date_trashed_ms: number; 1535 subtype: PhotoSubtype; 1536 } 1537 1538 class MovingPhotoHandle implements MovingPhoto { 1539 private nativeMovingPhoto: long = 0; 1540 1541 constructor(context: long) { 1542 if(this.nativeMovingPhoto == 0){ 1543 this.nativeMovingPhoto = context; 1544 } 1545 } 1546 1547 requestContent(imageFileUri: string, videoFileUri: string): Promise<void> { 1548 return new Promise<void>((resolve: ResolveVoid, reject: RejectString) => { 1549 let cb = (): PromiseLike<void> => { this.requestContent1(imageFileUri, videoFileUri) }; 1550 taskpool.execute(cb).then((v: NullishType): void => { 1551 resolve(v as PromiseLike<void>); 1552 }); 1553 }); 1554 } 1555 requestContent(resourceType: ResourceType, fileUri: string): Promise<void> { 1556 return new Promise<void>((resolve: ResolveVoid, reject: RejectString) => { 1557 let cb = (): PromiseLike<void> => { this.requestContent2(resourceType, fileUri) } 1558 taskpool.execute(cb).then((v: NullishType): void => { 1559 resolve(v as PromiseLike<void>); 1560 }); 1561 }); 1562 } 1563 requestContent(resourceType: ResourceType): Promise<ArrayBuffer> { 1564 return new Promise<ArrayBuffer>((resolve: (v: ArrayBuffer) => void, reject: RejectString) => { 1565 let cb = (): ArrayBuffer => { return this.requestContent3(resourceType) }; 1566 taskpool.execute(cb).then((buffer: NullishType): void => { 1567 if (buffer === null || buffer === undefined) { 1568 let error: BusinessError<string> = { 1569 code: -1, 1570 data: "Operation failed", 1571 name: "", 1572 message: "" 1573 }; 1574 reject(error); 1575 } else { 1576 resolve(buffer as ArrayBuffer); 1577 } 1578 }); 1579 }); 1580 } 1581 1582 native requestContent1(imageFileUri: string, videoFileUri: string): void; 1583 native requestContent2(resourceType: ResourceType, fileUri: string): void; 1584 native requestContent3(resourceType: ResourceType): ArrayBuffer; 1585 native getUri(): string; 1586 } 1587 1588 export enum HighlightAlbumInfoType { 1589 COVER_INFO = 0, 1590 PLAY_INFO 1591 } 1592 1593 export enum HighlightUserActionType { 1594 INSERTED_PIC_COUNT = 0, 1595 REMOVED_PIC_COUNT, 1596 SHARED_SCREENSHOT_COUNT, 1597 SHARED_COVER_COUNT, 1598 RENAMED_COUNT, 1599 CHANGED_COVER_COUNT, 1600 RENDER_VIEWED_TIMES = 100, 1601 RENDER_VIEWED_DURATION, 1602 ART_LAYOUT_VIEWED_TIMES, 1603 ART_LAYOUT_VIEWED_DURATION 1604 } 1605 1606 export enum ThumbnailType { 1607 LCD = 1, 1608 THM = 2 1609 } 1610 1611 export class HighlightAlbum { 1612 constructor(album: Album) {} 1613 } 1614 1615 export enum CloudEnhancementTaskStage { 1616 TASK_STAGE_EXCEPTION = -1, 1617 TASK_STAGE_PREPARING, 1618 TASK_STAGE_UPLOADING, 1619 TASK_STAGE_EXECUTING, 1620 TASK_STAGE_DOWNLOADING, 1621 TASK_STAGE_FAILED, 1622 TASK_STAGE_COMPLETED 1623 } 1624 1625 export interface CloudEnhancementTaskState { 1626 readonly taskStage: CloudEnhancementTaskStage; 1627 readonly transferredFileSize?: number; 1628 readonly totalFileSize?: number; 1629 readonly expectedDuration?: number; 1630 readonly statusCode?: number; 1631 } 1632 1633 export class CloudEnhancement { 1634 } 1635 1636 export enum CloudEnhancementState { 1637 UNAVAILABLE = 0, 1638 AVAILABLE, 1639 EXECUTING, 1640 COMPLETED 1641 } 1642} 1643