1f6603c60Sopenharmony_ci/*
2f6603c60Sopenharmony_ci * Copyright (C) 2023-2024 Huawei Device Co., Ltd.
3f6603c60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4f6603c60Sopenharmony_ci * you may not use this file except in compliance with the License.
5f6603c60Sopenharmony_ci * You may obtain a copy of the License at
6f6603c60Sopenharmony_ci *
7f6603c60Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8f6603c60Sopenharmony_ci *
9f6603c60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10f6603c60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11f6603c60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12f6603c60Sopenharmony_ci * See the License for the specific language governing permissions and
13f6603c60Sopenharmony_ci * limitations under the License.
14f6603c60Sopenharmony_ci */
15f6603c60Sopenharmony_ci
16f6603c60Sopenharmony_ciimport photoAccessHelper from '@ohos.file.photoAccessHelper';
17f6603c60Sopenharmony_ciimport abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
18f6603c60Sopenharmony_ciimport bundleManager from '@ohos.bundle.bundleManager';
19f6603c60Sopenharmony_ciimport dataSharePredicates from '@ohos.data.dataSharePredicates';
20f6603c60Sopenharmony_ciimport abilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry';
21f6603c60Sopenharmony_ciimport fs, { ListFileOptions } from '@ohos.file.fs';
22f6603c60Sopenharmony_ciimport fileuri from "@ohos.file.fileuri";
23f6603c60Sopenharmony_ci
24f6603c60Sopenharmony_ciconst delegator = abilityDelegatorRegistry.getAbilityDelegator();
25f6603c60Sopenharmony_ciconst phAccessHelper = photoAccessHelper.getPhotoAccessHelper(globalThis.abilityContext);
26f6603c60Sopenharmony_ciconst photoType = photoAccessHelper.PhotoType;
27f6603c60Sopenharmony_ciconst photoKeys = photoAccessHelper.PhotoKeys;
28f6603c60Sopenharmony_ciconst albumKeys = photoAccessHelper.AlbumKeys;
29f6603c60Sopenharmony_ciconst albumType = photoAccessHelper.AlbumType;
30f6603c60Sopenharmony_ciconst albumSubtype = photoAccessHelper.AlbumSubtype;
31f6603c60Sopenharmony_ciconst DEFAULT_SLEEP_TIME = 10;
32f6603c60Sopenharmony_ci
33f6603c60Sopenharmony_ciconst context = globalThis.abilityContext;
34f6603c60Sopenharmony_ciconst pathDir = context.filesDir;
35f6603c60Sopenharmony_ci
36f6603c60Sopenharmony_cilet validImageExt = ['.jpg']
37f6603c60Sopenharmony_cilet validVideoExt = ['.mp4']
38f6603c60Sopenharmony_cilet validVideoMpegExt = ['.mpeg']
39f6603c60Sopenharmony_cilet validImageGifExt = ['.gif']
40f6603c60Sopenharmony_cilet validImagePngExt = ['.png']
41f6603c60Sopenharmony_ci
42f6603c60Sopenharmony_ciexport async function sleep(times = DEFAULT_SLEEP_TIME) : Promise<void> {
43f6603c60Sopenharmony_ci  await new Promise(res => setTimeout(res, times));
44f6603c60Sopenharmony_ci};
45f6603c60Sopenharmony_ci
46f6603c60Sopenharmony_ciexport function fetchAllOption() : photoAccessHelper.FetchOptions {
47f6603c60Sopenharmony_ci  const predicates = new dataSharePredicates.DataSharePredicates();
48f6603c60Sopenharmony_ci  const ops : photoAccessHelper.FetchOptions = {
49f6603c60Sopenharmony_ci    fetchColumns: [],
50f6603c60Sopenharmony_ci    predicates: predicates
51f6603c60Sopenharmony_ci  };
52f6603c60Sopenharmony_ci  return ops;
53f6603c60Sopenharmony_ci};
54f6603c60Sopenharmony_ci
55f6603c60Sopenharmony_ciexport function fetchOption(testNum, key, value) : photoAccessHelper.FetchOptions {
56f6603c60Sopenharmony_ci  const predicates = new dataSharePredicates.DataSharePredicates();
57f6603c60Sopenharmony_ci  predicates.equalTo(key, value);
58f6603c60Sopenharmony_ci  const ops : photoAccessHelper.FetchOptions = {
59f6603c60Sopenharmony_ci    fetchColumns: [],
60f6603c60Sopenharmony_ci    predicates: predicates
61f6603c60Sopenharmony_ci  };
62f6603c60Sopenharmony_ci  console.info(`${testNum} queryOps: ${key} = ${value}`);
63f6603c60Sopenharmony_ci  return ops;
64f6603c60Sopenharmony_ci};
65f6603c60Sopenharmony_ci
66f6603c60Sopenharmony_ciexport function albumFetchOption(testNum, key, value) : photoAccessHelper.FetchOptions {
67f6603c60Sopenharmony_ci  const predicates = new dataSharePredicates.DataSharePredicates();
68f6603c60Sopenharmony_ci  predicates.equalTo(key, value);
69f6603c60Sopenharmony_ci  const ops : photoAccessHelper.FetchOptions = {
70f6603c60Sopenharmony_ci    fetchColumns: [],
71f6603c60Sopenharmony_ci    predicates: predicates
72f6603c60Sopenharmony_ci  };
73f6603c60Sopenharmony_ci  console.info(`${testNum} queryOps: ${key} = ${value}`);
74f6603c60Sopenharmony_ci  return ops;
75f6603c60Sopenharmony_ci};
76f6603c60Sopenharmony_ci
77f6603c60Sopenharmony_ciexport function photoFetchOption(testNum, key, value) : photoAccessHelper.FetchOptions {
78f6603c60Sopenharmony_ci  const predicates = new dataSharePredicates.DataSharePredicates();
79f6603c60Sopenharmony_ci  predicates.equalTo(key, value);
80f6603c60Sopenharmony_ci  const ops : photoAccessHelper.FetchOptions = {
81f6603c60Sopenharmony_ci    fetchColumns: [
82f6603c60Sopenharmony_ci      photoKeys.URI,
83f6603c60Sopenharmony_ci      photoKeys.PHOTO_TYPE,
84f6603c60Sopenharmony_ci      photoKeys.DISPLAY_NAME,
85f6603c60Sopenharmony_ci      photoKeys.DATE_ADDED,
86f6603c60Sopenharmony_ci      photoKeys.DATE_MODIFIED,
87f6603c60Sopenharmony_ci      photoKeys.DURATION,
88f6603c60Sopenharmony_ci      photoKeys.WIDTH,
89f6603c60Sopenharmony_ci      photoKeys.HEIGHT,
90f6603c60Sopenharmony_ci      photoKeys.DATE_TAKEN,
91f6603c60Sopenharmony_ci      photoKeys.ORIENTATION,
92f6603c60Sopenharmony_ci      photoKeys.FAVORITE,
93f6603c60Sopenharmony_ci      photoKeys.SIZE,
94f6603c60Sopenharmony_ci      photoKeys.TITLE,
95f6603c60Sopenharmony_ci      photoKeys.POSITION,
96f6603c60Sopenharmony_ci      photoKeys.DATE_TRASHED,
97f6603c60Sopenharmony_ci      photoKeys.HIDDEN,
98f6603c60Sopenharmony_ci      photoKeys.CAMERA_SHOT_KEY,
99f6603c60Sopenharmony_ci      photoKeys.USER_COMMENT,
100f6603c60Sopenharmony_ci      photoKeys.DATE_ADDED_MS,
101f6603c60Sopenharmony_ci      photoKeys.DATE_MODIFIED_MS,
102f6603c60Sopenharmony_ci      photoKeys.DYNAMIC_RANGE_TYPE,
103f6603c60Sopenharmony_ci      photoKeys.COVER_POSITION,
104f6603c60Sopenharmony_ci      photoKeys.BURST_KEY,
105f6603c60Sopenharmony_ci      photoKeys.LCD_SIZE,
106f6603c60Sopenharmony_ci      photoKeys.THM_SIZE,
107f6603c60Sopenharmony_ci      'all_exif',
108f6603c60Sopenharmony_ci    ],
109f6603c60Sopenharmony_ci    predicates: predicates
110f6603c60Sopenharmony_ci  };
111f6603c60Sopenharmony_ci  console.info(`${testNum} queryOps: ${key} = ${value}`);
112f6603c60Sopenharmony_ci  return ops;
113f6603c60Sopenharmony_ci};
114f6603c60Sopenharmony_ci
115f6603c60Sopenharmony_ciexport async function getPermission(name = 'ohos.acts.multimedia.photoaccess') : Promise<void> {
116f6603c60Sopenharmony_ci  try {
117f6603c60Sopenharmony_ci    console.info('getPermission start', name);
118f6603c60Sopenharmony_ci    let permissionState = new Map();
119f6603c60Sopenharmony_ci    const permissions: Array<Permissions> = [
120f6603c60Sopenharmony_ci      'ohos.permission.MEDIA_LOCATION',
121f6603c60Sopenharmony_ci      'ohos.permission.READ_IMAGEVIDEO',
122f6603c60Sopenharmony_ci      'ohos.permission.WRITE_IMAGEVIDEO',
123f6603c60Sopenharmony_ci    ];
124f6603c60Sopenharmony_ci
125f6603c60Sopenharmony_ci    const atManager = abilityAccessCtrl.createAtManager();
126f6603c60Sopenharmony_ci    const appFlags = bundleManager.ApplicationFlag.GET_APPLICATION_INFO_DEFAULT;
127f6603c60Sopenharmony_ci    const userId = 100;
128f6603c60Sopenharmony_ci    const appInfo = await bundleManager.getApplicationInfo(name, appFlags, userId);
129f6603c60Sopenharmony_ci    const tokenID = appInfo.accessTokenId;
130f6603c60Sopenharmony_ci    for (const permission of permissions) {
131f6603c60Sopenharmony_ci      console.info('getPermission permission: ' + permission);
132f6603c60Sopenharmony_ci      try {
133f6603c60Sopenharmony_ci        await atManager.grantUserGrantedPermission(tokenID, permission, 1);
134f6603c60Sopenharmony_ci      } catch (error) {
135f6603c60Sopenharmony_ci        console.error(`getPermission ${permission} failed`);
136f6603c60Sopenharmony_ci      }
137f6603c60Sopenharmony_ci      permissionState.set(permission, await atManager.verifyAccessToken(tokenID, permission));
138f6603c60Sopenharmony_ci    }
139f6603c60Sopenharmony_ci    permissionState.forEach((value, key, map) => {
140f6603c60Sopenharmony_ci      if (value !== 0) {
141f6603c60Sopenharmony_ci        console.info(`getPermission failed; permission: ${key}, state: ${value}`);
142f6603c60Sopenharmony_ci      }
143f6603c60Sopenharmony_ci    });
144f6603c60Sopenharmony_ci    console.info('getPermission end');
145f6603c60Sopenharmony_ci  } catch (error) {
146f6603c60Sopenharmony_ci    console.error(`getPermission failed, error: ${error}`);
147f6603c60Sopenharmony_ci  }
148f6603c60Sopenharmony_ci};
149f6603c60Sopenharmony_ci
150f6603c60Sopenharmony_ciexport function isNum(value) : boolean {
151f6603c60Sopenharmony_ci  return typeof value === 'number' && !isNaN(value);
152f6603c60Sopenharmony_ci};
153f6603c60Sopenharmony_ci
154f6603c60Sopenharmony_ciexport function getAssetId(uri) : string {
155f6603c60Sopenharmony_ci  const tag = 'Photo/';
156f6603c60Sopenharmony_ci  const index = uri.indexOf(tag);
157f6603c60Sopenharmony_ci  let str = uri.substring(index + tag.length);
158f6603c60Sopenharmony_ci  console.info(`getAssetId str: ${str}`);
159f6603c60Sopenharmony_ci  return str;
160f6603c60Sopenharmony_ci}
161f6603c60Sopenharmony_ci
162f6603c60Sopenharmony_ciexport function getAlbumId(uri) : string {
163f6603c60Sopenharmony_ci  const index = uri.lastIndexOf('/');
164f6603c60Sopenharmony_ci  let str = uri.substring(index + 1);
165f6603c60Sopenharmony_ci  console.info(`getAlbumId str: ${str}`);
166f6603c60Sopenharmony_ci  return str;
167f6603c60Sopenharmony_ci}
168f6603c60Sopenharmony_ci
169f6603c60Sopenharmony_ciexport function genRadomStr(len: number) : string {
170f6603c60Sopenharmony_ci  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
171f6603c60Sopenharmony_ci  let randomStr = '';
172f6603c60Sopenharmony_ci  for (let i = 0; i < len; i++) {
173f6603c60Sopenharmony_ci    randomStr += chars.charAt(Math.floor(Math.random() * chars.length));
174f6603c60Sopenharmony_ci  }
175f6603c60Sopenharmony_ci  return randomStr;
176f6603c60Sopenharmony_ci}
177f6603c60Sopenharmony_ci
178f6603c60Sopenharmony_ciexport async function createUserAlbum(testNum, albumName) : Promise<photoAccessHelper.Album> {
179f6603c60Sopenharmony_ci  console.info(`${testNum} createUserAlbum albumName: ${albumName}`);
180f6603c60Sopenharmony_ci  let album: photoAccessHelper.Album;
181f6603c60Sopenharmony_ci  try {
182f6603c60Sopenharmony_ci    const helper = photoAccessHelper.getPhotoAccessHelper(globalThis.abilityContext);
183f6603c60Sopenharmony_ci    album = await helper.createAlbum(albumName);
184f6603c60Sopenharmony_ci    console.info(`${testNum} createUserAlbum suc`);
185f6603c60Sopenharmony_ci  } catch (error) {
186f6603c60Sopenharmony_ci    console.error(`Failed to createUserAlbum! error: ${error}`);
187f6603c60Sopenharmony_ci    throw error;
188f6603c60Sopenharmony_ci  }
189f6603c60Sopenharmony_ci
190f6603c60Sopenharmony_ci  return new Promise((resolve, reject) => {
191f6603c60Sopenharmony_ci    resolve(album);
192f6603c60Sopenharmony_ci  });
193f6603c60Sopenharmony_ci}
194f6603c60Sopenharmony_ci
195f6603c60Sopenharmony_ciexport async function getFileAsset(testNum, fetchOps) : Promise<photoAccessHelper.PhotoAsset> {
196f6603c60Sopenharmony_ci  let asset: photoAccessHelper.PhotoAsset;
197f6603c60Sopenharmony_ci  try {
198f6603c60Sopenharmony_ci    const helper = photoAccessHelper.getPhotoAccessHelper(globalThis.abilityContext);
199f6603c60Sopenharmony_ci    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset>;
200f6603c60Sopenharmony_ci    fetchResult = await helper.getAssets(fetchOps);
201f6603c60Sopenharmony_ci    console.info(`${testNum} getFileAsset fetchResult: ${fetchResult.getCount()}`);
202f6603c60Sopenharmony_ci    asset = await fetchResult.getFirstObject();
203f6603c60Sopenharmony_ci    fetchResult.close();
204f6603c60Sopenharmony_ci  } catch (error) {
205f6603c60Sopenharmony_ci    console.error(`${testNum} getFileAsset error: ${error}`);
206f6603c60Sopenharmony_ci    throw error;
207f6603c60Sopenharmony_ci  }
208f6603c60Sopenharmony_ci
209f6603c60Sopenharmony_ci  return new Promise((resolve, reject) => {
210f6603c60Sopenharmony_ci    resolve(asset);
211f6603c60Sopenharmony_ci  });
212f6603c60Sopenharmony_ci}
213f6603c60Sopenharmony_ci
214f6603c60Sopenharmony_ciexport function getFileAssetFetchResult() : photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> {
215f6603c60Sopenharmony_ci  let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset>;
216f6603c60Sopenharmony_ci  return fetchResult;
217f6603c60Sopenharmony_ci}
218f6603c60Sopenharmony_ci
219f6603c60Sopenharmony_ciexport function getAlbumFetchResult() : photoAccessHelper.FetchResult<photoAccessHelper.Album> {
220f6603c60Sopenharmony_ci  let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album>;
221f6603c60Sopenharmony_ci  return fetchResult;
222f6603c60Sopenharmony_ci}
223f6603c60Sopenharmony_ci
224f6603c60Sopenharmony_ciexport function checkUserAlbum(expect, testNum, album, expectedName, expectedCover) : void {
225f6603c60Sopenharmony_ci  console.info(`${testNum} checkUserAlbum album.albumName: ${album.albumName}, expectedName: ${expectedName}`);
226f6603c60Sopenharmony_ci  expect(album.albumType).assertEqual(albumType.USER);
227f6603c60Sopenharmony_ci  expect(album.albumSubtype).assertEqual(albumSubtype.USER_GENERIC);
228f6603c60Sopenharmony_ci  expect(album.albumName).assertEqual(expectedName);
229f6603c60Sopenharmony_ci  if (expectedCover === '') {
230f6603c60Sopenharmony_ci    expect(album.coverUri).assertEqual('');
231f6603c60Sopenharmony_ci  } else {
232f6603c60Sopenharmony_ci    expect(album.coverUri).assertEqual(expectedCover);
233f6603c60Sopenharmony_ci  }
234f6603c60Sopenharmony_ci  expect(album.albumUri !== '').assertEqual(true);
235f6603c60Sopenharmony_ci  expect(album.count).assertEqual(0);
236f6603c60Sopenharmony_ci}
237f6603c60Sopenharmony_ci
238f6603c60Sopenharmony_ciexport function checkSystemAlbum(expect, testNum, album, expectedSubType) : void {
239f6603c60Sopenharmony_ci  try {
240f6603c60Sopenharmony_ci    console.info(`${testNum} checkSystemAlbum expectedSubType: ${expectedSubType}`);
241f6603c60Sopenharmony_ci    expect(album.albumType).assertEqual(albumType.SYSTEM);
242f6603c60Sopenharmony_ci    expect(album.albumSubtype).assertEqual(expectedSubType);
243f6603c60Sopenharmony_ci    expect(album.albumName).assertEqual('');
244f6603c60Sopenharmony_ci    expect(album.albumUri !== '').assertEqual(true);
245f6603c60Sopenharmony_ci  } catch (error) {
246f6603c60Sopenharmony_ci    console.error(`Failed to delete all user albums! error: ${error}`);
247f6603c60Sopenharmony_ci    throw error;
248f6603c60Sopenharmony_ci  }
249f6603c60Sopenharmony_ci}
250f6603c60Sopenharmony_ci
251f6603c60Sopenharmony_ciexport async function startAbility(bundleName: string, abilityName: string) : Promise<void> {
252f6603c60Sopenharmony_ci  await delegator.executeShellCommand(`aa start -b ${bundleName} -a ${abilityName}`).then(result => {
253f6603c60Sopenharmony_ci    console.info(`[picker] start abilityFinished: ${result}`);
254f6603c60Sopenharmony_ci  }).catch(err => {
255f6603c60Sopenharmony_ci    console.error(`[picker] start abilityFailed: ${err}`);
256f6603c60Sopenharmony_ci  });
257f6603c60Sopenharmony_ci}
258f6603c60Sopenharmony_ci
259f6603c60Sopenharmony_ciexport async function stopAbility(bundleName: string) : Promise<void> {
260f6603c60Sopenharmony_ci  await delegator.executeShellCommand(`aa force-stop ${bundleName}`).then(result => {
261f6603c60Sopenharmony_ci    console.info(`[picker] stop abilityFinished: ${result}`);
262f6603c60Sopenharmony_ci  }).catch(err => {
263f6603c60Sopenharmony_ci    console.error(`[picker] stop abilityFailed: ${err}`);
264f6603c60Sopenharmony_ci  });
265f6603c60Sopenharmony_ci}
266f6603c60Sopenharmony_ci
267f6603c60Sopenharmony_ciexport async function getFileNameArray() {
268f6603c60Sopenharmony_ci  try{
269f6603c60Sopenharmony_ci    let listFileOption: ListFileOptions = {
270f6603c60Sopenharmony_ci      recursion: true,
271f6603c60Sopenharmony_ci      listNum: 0,
272f6603c60Sopenharmony_ci      filter: {
273f6603c60Sopenharmony_ci        suffix: [],
274f6603c60Sopenharmony_ci      }
275f6603c60Sopenharmony_ci    }
276f6603c60Sopenharmony_ci    listFileOption.filter.suffix = validImageExt.concat(validVideoExt);
277f6603c60Sopenharmony_ci    let nameArray = await fs.listFile(pathDir, listFileOption)
278f6603c60Sopenharmony_ci    return nameArray;
279f6603c60Sopenharmony_ci  } catch (err) {
280f6603c60Sopenharmony_ci    console.error('getFileNameArray failed: ' + err);
281f6603c60Sopenharmony_ci  }
282f6603c60Sopenharmony_ci}
283f6603c60Sopenharmony_ci
284f6603c60Sopenharmony_ciexport async function getAllFileNameArray() {
285f6603c60Sopenharmony_ci  try{
286f6603c60Sopenharmony_ci    let listFileOption: ListFileOptions = {
287f6603c60Sopenharmony_ci      recursion: true,
288f6603c60Sopenharmony_ci      listNum: 0,
289f6603c60Sopenharmony_ci      filter: {
290f6603c60Sopenharmony_ci        suffix: [],
291f6603c60Sopenharmony_ci      }
292f6603c60Sopenharmony_ci    }
293f6603c60Sopenharmony_ci    listFileOption.filter.suffix = validImageExt.concat(validVideoExt).concat(validVideoMpegExt).concat(validImageGifExt).concat(validImagePngExt);
294f6603c60Sopenharmony_ci    let nameArray = await fs.listFile(pathDir, listFileOption)
295f6603c60Sopenharmony_ci    return nameArray;
296f6603c60Sopenharmony_ci  } catch (err) {
297f6603c60Sopenharmony_ci    console.error('getFileNameArray failed: ' + err);
298f6603c60Sopenharmony_ci  }
299f6603c60Sopenharmony_ci}
300f6603c60Sopenharmony_ci
301f6603c60Sopenharmony_ciexport async function pushCreateAsset(names: Array<string>){
302f6603c60Sopenharmony_ci  console.info('pushCreateAsset start')
303f6603c60Sopenharmony_ci  let successNum = 0;
304f6603c60Sopenharmony_ci  try{
305f6603c60Sopenharmony_ci    console.info('pushCreateAsset name: ' + names)
306f6603c60Sopenharmony_ci    let photoType: photoAccessHelper.PhotoType;
307f6603c60Sopenharmony_ci    let resourceType: photoAccessHelper.ResourceType;
308f6603c60Sopenharmony_ci    let fileNames: string[] = await getFileNameArray();
309f6603c60Sopenharmony_ci    console.info('pushCreateAsset rawFiles number: ' + fileNames.length);
310f6603c60Sopenharmony_ci    for(let i = 0; i < fileNames.length; i++) {
311f6603c60Sopenharmony_ci      let fileName = fileNames[i];
312f6603c60Sopenharmony_ci      let filePath = pathDir + '/' + fileName;
313f6603c60Sopenharmony_ci      let fileUri = fileuri.getUriFromPath(filePath);
314f6603c60Sopenharmony_ci      let rawExtension: string = fileName.split('.')[1];
315f6603c60Sopenharmony_ci      for (let j = 0; j < names.length; j++) {
316f6603c60Sopenharmony_ci        let name = names[j];
317f6603c60Sopenharmony_ci        if (fileName.includes('error')) continue
318f6603c60Sopenharmony_ci        let extension: string = name.split('.')[1];
319f6603c60Sopenharmony_ci        if (rawExtension === extension) {
320f6603c60Sopenharmony_ci          let options: photoAccessHelper.CreateOptions = {
321f6603c60Sopenharmony_ci            title: name.split('.')[0]
322f6603c60Sopenharmony_ci          }
323f6603c60Sopenharmony_ci          if (validImageExt.includes(('.' + extension))) {
324f6603c60Sopenharmony_ci            photoType = photoAccessHelper.PhotoType.IMAGE;
325f6603c60Sopenharmony_ci            resourceType = photoAccessHelper.ResourceType.IMAGE_RESOURCE;
326f6603c60Sopenharmony_ci          } else {
327f6603c60Sopenharmony_ci            photoType = photoAccessHelper.PhotoType.VIDEO;
328f6603c60Sopenharmony_ci            resourceType = photoAccessHelper.ResourceType.VIDEO_RESOURCE;
329f6603c60Sopenharmony_ci          }
330f6603c60Sopenharmony_ci          let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = photoAccessHelper.MediaAssetChangeRequest.createAssetRequest(globalThis.abilityContext, photoType, extension, options);
331f6603c60Sopenharmony_ci          assetChangeRequest.addResource(resourceType, fileUri);
332f6603c60Sopenharmony_ci          await phAccessHelper.applyChanges(assetChangeRequest);
333f6603c60Sopenharmony_ci          console.info(`pushCreateAsset ${name} create success`)
334f6603c60Sopenharmony_ci          successNum++;
335f6603c60Sopenharmony_ci        }
336f6603c60Sopenharmony_ci      }
337f6603c60Sopenharmony_ci    }
338f6603c60Sopenharmony_ci    console.info('Push_createAsset successfully fileNumber: ' + successNum);
339f6603c60Sopenharmony_ci  }catch(err){
340f6603c60Sopenharmony_ci    console.error('Push_createAsset push resource failed: ' + err)
341f6603c60Sopenharmony_ci    return;
342f6603c60Sopenharmony_ci  }
343f6603c60Sopenharmony_ci}
344f6603c60Sopenharmony_ci
345f6603c60Sopenharmony_ciexport async function pushCreateAssetSingle(names: Array<string>){
346f6603c60Sopenharmony_ci  console.info('pushCreateAssetSingle start')
347f6603c60Sopenharmony_ci  let successNum = 0;
348f6603c60Sopenharmony_ci  try{
349f6603c60Sopenharmony_ci    console.info('pushCreateAssetSingle name: ' + names)
350f6603c60Sopenharmony_ci    let photoType: photoAccessHelper.PhotoType;
351f6603c60Sopenharmony_ci    let resourceType: photoAccessHelper.ResourceType;
352f6603c60Sopenharmony_ci    let fileNames: string[] = await getAllFileNameArray();
353f6603c60Sopenharmony_ci    for (let i = 0; i < fileNames.length; i++) {
354f6603c60Sopenharmony_ci      let fileName = fileNames[i];
355f6603c60Sopenharmony_ci      let filePath = pathDir + '/' + fileName;
356f6603c60Sopenharmony_ci      let fileUri = fileuri.getUriFromPath(filePath);
357f6603c60Sopenharmony_ci      let rawExtension: string = fileName.split('.')[1];
358f6603c60Sopenharmony_ci      for (let j = 0; j < names.length; j++) {
359f6603c60Sopenharmony_ci        let name = names[j];
360f6603c60Sopenharmony_ci        if(fileName == '/01.jpg' || fileName == '/01.mp4') continue
361f6603c60Sopenharmony_ci        let extension: string = name.split('.')[1];
362f6603c60Sopenharmony_ci        if (rawExtension === extension) {
363f6603c60Sopenharmony_ci          let options: photoAccessHelper.CreateOptions = {
364f6603c60Sopenharmony_ci            title: name.split('.')[0]
365f6603c60Sopenharmony_ci          }
366f6603c60Sopenharmony_ci          if (validImageExt.concat(validImageGifExt).concat(validImagePngExt).includes(('.' + extension))) {
367f6603c60Sopenharmony_ci            photoType = photoAccessHelper.PhotoType.IMAGE;
368f6603c60Sopenharmony_ci            resourceType = photoAccessHelper.ResourceType.IMAGE_RESOURCE;
369f6603c60Sopenharmony_ci          } else {
370f6603c60Sopenharmony_ci            photoType = photoAccessHelper.PhotoType.VIDEO;
371f6603c60Sopenharmony_ci            resourceType = photoAccessHelper.ResourceType.VIDEO_RESOURCE;
372f6603c60Sopenharmony_ci          }
373f6603c60Sopenharmony_ci          let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = photoAccessHelper.MediaAssetChangeRequest.createAssetRequest(globalThis.abilityContext, photoType, extension, options);
374f6603c60Sopenharmony_ci          assetChangeRequest.addResource(resourceType, fileUri);
375f6603c60Sopenharmony_ci          await phAccessHelper.applyChanges(assetChangeRequest);
376f6603c60Sopenharmony_ci          console.info(`pushCreateAssetSingle ${name} create success`)
377f6603c60Sopenharmony_ci          successNum++;
378f6603c60Sopenharmony_ci        }
379f6603c60Sopenharmony_ci      }
380f6603c60Sopenharmony_ci    }
381f6603c60Sopenharmony_ci    console.info('Push_createAsset successfully fileNumber: ' + successNum);
382f6603c60Sopenharmony_ci  }catch(err){
383f6603c60Sopenharmony_ci    console.error('Push_createAsset push resource failed: ' + err)
384f6603c60Sopenharmony_ci    return;
385f6603c60Sopenharmony_ci  }
386f6603c60Sopenharmony_ci}
387f6603c60Sopenharmony_ci
388f6603c60Sopenharmony_ciexport function createSandboxFileUri(extension) {
389f6603c60Sopenharmony_ci  let pathDir = globalThis.abilityContext.filesDir;
390f6603c60Sopenharmony_ci  let path = pathDir + '/test' + new Date().getTime() + '.' + extension;
391f6603c60Sopenharmony_ci  fs.openSync(path, fs.OpenMode.CREATE)
392f6603c60Sopenharmony_ci  return fileuri.getUriFromPath(path);
393f6603c60Sopenharmony_ci}
394f6603c60Sopenharmony_ci
395f6603c60Sopenharmony_ciexport async function getBurstKey(testNum: string, fetchOps: photoAccessHelper.FetchOptions): Promise<string | number> {
396f6603c60Sopenharmony_ci  let burstKey: string | number | undefined = -1;
397f6603c60Sopenharmony_ci  try {
398f6603c60Sopenharmony_ci    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOps);
399f6603c60Sopenharmony_ci    if (fetchResult === undefined) {
400f6603c60Sopenharmony_ci      console.error(`${testNum} :: getBurstKey :: fetchResult is undefined !`);
401f6603c60Sopenharmony_ci      return burstKey;
402f6603c60Sopenharmony_ci    }
403f6603c60Sopenharmony_ci    let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
404f6603c60Sopenharmony_ci    if (photoAsset === undefined) {
405f6603c60Sopenharmony_ci      console.error(`${testNum} :: getBurstKey :: photoAsset is undefined !`);
406f6603c60Sopenharmony_ci      return burstKey;
407f6603c60Sopenharmony_ci    }
408f6603c60Sopenharmony_ci    burstKey = photoAsset.get(photoKeys.BURST_KEY).toString();
409f6603c60Sopenharmony_ci    console.log(`${testNum} :: get burstKey success, burstKey is ${burstKey}`);
410f6603c60Sopenharmony_ci    return burstKey;
411f6603c60Sopenharmony_ci  } catch (error) {
412f6603c60Sopenharmony_ci    console.error(`${testNum} :: getBurstKey failed, msg is ${error}`);
413f6603c60Sopenharmony_ci    return burstKey;
414f6603c60Sopenharmony_ci  }
415f6603c60Sopenharmony_ci}
416f6603c60Sopenharmony_ci
417f6603c60Sopenharmony_ciexport {
418f6603c60Sopenharmony_ci  photoType,
419f6603c60Sopenharmony_ci  photoKeys,
420f6603c60Sopenharmony_ci  albumKeys,
421f6603c60Sopenharmony_ci  albumType,
422f6603c60Sopenharmony_ci  albumSubtype,
423f6603c60Sopenharmony_ci};