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