• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2024 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 
16 #ifndef INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIA_LIBRARY_NAPI_H_
17 #define INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIA_LIBRARY_NAPI_H_
18 
19 #include <mutex>
20 #include <vector>
21 #include "abs_shared_result_set.h"
22 #include "album_napi.h"
23 #include "data_ability_helper.h"
24 #include "data_ability_observer_stub.h"
25 #include "data_ability_predicates.h"
26 #include "fetch_file_result_napi.h"
27 #include "file_asset_napi.h"
28 #include "napi_base_context.h"
29 #include "napi/native_api.h"
30 #include "napi/native_node_api.h"
31 #include "napi_error.h"
32 #include "photo_album.h"
33 #include "smart_album_asset.h"
34 #include "values_bucket.h"
35 #include "napi_remote_object.h"
36 #include "datashare_helper.h"
37 #include "datashare_predicates.h"
38 #include "uv.h"
39 
40 namespace OHOS {
41 namespace Media {
42 #define EXPORT __attribute__ ((visibility ("default")))
43 #define DECLARE_WRITABLE_NAPI_FUNCTION(name, func)                                 \
44     {                                                                              \
45         (name), nullptr, (func), nullptr, nullptr, nullptr, napi_writable, nullptr \
46     }
47 static const std::string MEDIA_LIB_NAPI_CLASS_NAME = "MediaLibrary";
48 static const std::string USERFILE_MGR_NAPI_CLASS_NAME = "UserFileManager";
49 static const std::string PHOTOACCESSHELPER_NAPI_CLASS_NAME = "PhotoAccessHelper";
50 
51 enum ListenerType {
52     INVALID_LISTENER = -1,
53 
54     AUDIO_LISTENER,
55     VIDEO_LISTENER,
56     IMAGE_LISTENER,
57     FILE_LISTENER,
58     SMARTALBUM_LISTENER,
59     DEVICE_LISTENER,
60     REMOTEFILE_LISTENER,
61     ALBUM_LISTENER
62 };
63 
64 enum ReplaceSelectionMode {
65     DEFAULT = 0,
66     ADD_DOCS_TO_RELATIVE_PATH,
67 };
68 
69 struct MediaChangeListener {
70     MediaType mediaType;
71     OHOS::DataShare::DataShareObserver::ChangeInfo changeInfo;
72     std::string strUri;
73 };
74 
75 struct AnalysisProperty {
76     std::string enumName;
77     int32_t enumValue;
78 };
79 
80 class MediaOnNotifyObserver;
81 class ChangeListenerNapi {
82 public:
83     class UvChangeMsg {
84     public:
UvChangeMsg(napi_env env,napi_ref ref,OHOS::DataShare::DataShareObserver::ChangeInfo & changeInfo,std::string strUri)85         UvChangeMsg(napi_env env, napi_ref ref,
86                     OHOS::DataShare::DataShareObserver::ChangeInfo &changeInfo,
87                     std::string strUri)
88             : env_(env), ref_(ref), changeInfo_(changeInfo),
89             strUri_(std::move(strUri)) {}
~UvChangeMsg()90         ~UvChangeMsg() {}
91         napi_env env_;
92         napi_ref ref_;
93         OHOS::DataShare::DataShareObserver::ChangeInfo changeInfo_;
94         uint8_t *data_ {nullptr};
95         std::string strUri_;
96     };
97 
98     struct JsOnChangeCallbackWrapper {
99         UvChangeMsg* msg_;
100         std::list<std::string> extraUris_;
101         uint32_t uriSize_ { 0 };
102         std::shared_ptr<NativeRdb::ResultSet> sharedAssets_;
103         std::vector<std::shared_ptr<RowObject>> sharedAssetsRowObjVector_;
104         std::shared_ptr<NativeRdb::ResultSet> extraSharedAssets_;
105     };
106 
ChangeListenerNapi(napi_env env)107     explicit ChangeListenerNapi(napi_env env) : env_(env) {}
108 
ChangeListenerNapi(const ChangeListenerNapi & listener)109     ChangeListenerNapi(const ChangeListenerNapi &listener)
110     {
111         this->env_ = listener.env_;
112         this->cbOnRef_ = listener.cbOnRef_;
113         this->cbOffRef_ = listener.cbOffRef_;
114     }
115 
116     ChangeListenerNapi& operator=(const ChangeListenerNapi &listener)
117     {
118         this->env_ = listener.env_;
119         this->cbOnRef_ = listener.cbOnRef_;
120         this->cbOffRef_ = listener.cbOffRef_;
121         return *this;
122     }
123 
~ChangeListenerNapi()124     ~ChangeListenerNapi() {};
125 
126     void OnChange(MediaChangeListener &listener, const napi_ref cbRef);
127     void QueryRdbAndNotifyChange(uv_loop_s *loop, UvChangeMsg *msg, uv_work_t *work);
128     int UvQueueWork(uv_loop_s *loop, uv_work_t *work);
129     static napi_value SolveOnChange(napi_env env, JsOnChangeCallbackWrapper* wrapper);
130     void GetResultSetFromMsg(UvChangeMsg* msg, JsOnChangeCallbackWrapper* wrapper);
131     std::shared_ptr<NativeRdb::ResultSet> GetSharedResultSetFromIds(std::vector<string>& Ids, bool isPhoto);
132     void GetIdsFromUris(std::list<Uri>& listValue, std::vector<string>& ids, bool isPhoto);
133     static string GetTrashAlbumUri();
134     static std::string trashAlbumUri_;
135     napi_ref cbOnRef_ = nullptr;
136     napi_ref cbOffRef_ = nullptr;
137     sptr<AAFwk::IDataAbilityObserver> audioDataObserver_ = nullptr;
138     sptr<AAFwk::IDataAbilityObserver> videoDataObserver_ = nullptr;
139     sptr<AAFwk::IDataAbilityObserver> imageDataObserver_ = nullptr;
140     sptr<AAFwk::IDataAbilityObserver> fileDataObserver_ = nullptr;
141     sptr<AAFwk::IDataAbilityObserver> smartAlbumDataObserver_ = nullptr;
142     sptr<AAFwk::IDataAbilityObserver> deviceDataObserver_ = nullptr;
143     sptr<AAFwk::IDataAbilityObserver> remoteFileDataObserver_ = nullptr;
144     sptr<AAFwk::IDataAbilityObserver> albumDataObserver_ = nullptr;
145     std::vector<std::shared_ptr<MediaOnNotifyObserver>> observers_;
146 private:
147     napi_env env_ = nullptr;
148 
149     static napi_status SetSharedAssetArray(const napi_env& env, const char* fieldStr,
150         ChangeListenerNapi::JsOnChangeCallbackWrapper *wrapper, napi_value& result, bool isPhoto);
151 
152     static int ParseSharedPhotoAssets(ChangeListenerNapi::JsOnChangeCallbackWrapper *wrapper,
153         bool isPhoto);
154     static napi_value BuildSharedPhotoAssetsObj(const napi_env& env,
155         ChangeListenerNapi::JsOnChangeCallbackWrapper *wrapper, bool isPhoto);
156 };
157 
158 class MediaObserver : public AAFwk::DataAbilityObserverStub {
159 public:
MediaObserver(const ChangeListenerNapi & listObj,MediaType mediaType)160     MediaObserver(const ChangeListenerNapi &listObj, MediaType mediaType) : listObj_(listObj)
161     {
162         mediaType_ = mediaType;
163     }
164 
165     ~MediaObserver() = default;
166 
OnChange()167     void OnChange() override
168     {
169         MediaChangeListener listener;
170         listener.mediaType = mediaType_;
171         listObj_.OnChange(listener, listObj_.cbOnRef_);
172     }
173 
174     ChangeListenerNapi listObj_;
175     MediaType mediaType_;
176 };
177 
178 class MediaOnNotifyObserver : public DataShare::DataShareObserver  {
179 public:
MediaOnNotifyObserver(const ChangeListenerNapi & listObj,std::string uri,napi_ref ref)180     MediaOnNotifyObserver(const ChangeListenerNapi &listObj, std::string uri, napi_ref ref) : listObj_(listObj)
181     {
182         uri_ = uri;
183         ref_ = ref;
184     }
185 
186     ~MediaOnNotifyObserver() = default;
187 
OnChange(const ChangeInfo & changeInfo)188     void OnChange(const ChangeInfo &changeInfo) override
189     {
190         MediaChangeListener listener;
191         listener.changeInfo = changeInfo;
192         listener.strUri = uri_;
193         listObj_.OnChange(listener, ref_);
194     }
195     ChangeListenerNapi listObj_;
196     std::string uri_;
197     napi_ref ref_;
198 };
199 
200 class ThumbnailBatchGenerateObserver : public DataShare::DataShareObserver {
201 public:
202     ThumbnailBatchGenerateObserver() = default;
203     ~ThumbnailBatchGenerateObserver() = default;
204 
205     void OnChange(const ChangeInfo &changeInfo) override;
206 };
207 
208 class ThumbnailGenerateHandler {
209 public:
ThumbnailGenerateHandler(napi_ref ref,napi_threadsafe_function func)210     ThumbnailGenerateHandler(napi_ref ref, napi_threadsafe_function func) : callbackRef_(ref), threadSafeFunc_(func) {}
211     ~ThumbnailGenerateHandler() = default;
212 
213     napi_ref callbackRef_;
214     napi_threadsafe_function threadSafeFunc_;
215 };
216 
217 class MediaLibraryNapi {
218 public:
219     EXPORT static napi_value Init(napi_env env, napi_value exports);
220     EXPORT static napi_value UserFileMgrInit(napi_env env, napi_value exports);
221     EXPORT static napi_value PhotoAccessHelperInit(napi_env env, napi_value exports);
222 
223     static void ReplaceSelection(std::string &selection, std::vector<std::string> &selectionArgs,
224         const std::string &key, const std::string &keyInstead, const int32_t mode = ReplaceSelectionMode::DEFAULT);
225     static void OnThumbnailGenerated(napi_env env, napi_value cb, void *context, void *data);
226     int32_t GetUserId();
227     void SetUserId(const int32_t &userId);
228 
229     EXPORT MediaLibraryNapi();
230     EXPORT ~MediaLibraryNapi();
231     static std::mutex sUserFileClientMutex_;
232 
233 private:
234     EXPORT static void MediaLibraryNapiDestructor(napi_env env, void *nativeObject, void *finalize_hint);
235     EXPORT static napi_value MediaLibraryNapiConstructor(napi_env env, napi_callback_info info);
236 
237     EXPORT static napi_value GetMediaLibraryNewInstance(napi_env env, napi_callback_info info);
238     EXPORT static napi_value GetMediaLibraryNewInstanceAsync(napi_env env, napi_callback_info info);
239 
240     EXPORT static napi_value JSGetPublicDirectory(napi_env env, napi_callback_info info);
241     EXPORT static napi_value JSGetFileAssets(napi_env env, napi_callback_info info);
242     EXPORT static napi_value JSGetAlbums(napi_env env, napi_callback_info info);
243 
244     EXPORT static napi_value JSCreateAsset(napi_env env, napi_callback_info info);
245     EXPORT static napi_value JSDeleteAsset(napi_env env, napi_callback_info info);
246 
247     EXPORT static napi_value JSOnCallback(napi_env env, napi_callback_info info);
248     EXPORT static napi_value JSOffCallback(napi_env env, napi_callback_info info);
249 
250     EXPORT static napi_value JSRelease(napi_env env, napi_callback_info info);
251 
252     EXPORT static napi_value JSGetActivePeers(napi_env env, napi_callback_info info);
253     EXPORT static napi_value JSGetAllPeers(napi_env env, napi_callback_info info);
254     EXPORT static napi_value CreateMediaTypeEnum(napi_env env);
255     EXPORT static napi_value CreateFileKeyEnum(napi_env env);
256     EXPORT static napi_value CreateDirectoryTypeEnum(napi_env env);
257     EXPORT static napi_value CreateVirtualAlbumTypeEnum(napi_env env);
258     EXPORT static napi_value CreatePrivateAlbumTypeEnum(napi_env env);
259     EXPORT static napi_value CreateDeliveryModeEnum(napi_env env);
260     EXPORT static napi_value CreateSourceModeEnum(napi_env env);
261     EXPORT static napi_value CreateCompatibleModeEnum(napi_env env);
262 
263     EXPORT static napi_value CreatePhotoKeysEnum(napi_env env);
264     EXPORT static napi_value CreateHiddenPhotosDisplayModeEnum(napi_env env);
265 
266     EXPORT static napi_value CreateMediaTypeUserFileEnum(napi_env env);
267     EXPORT static napi_value CreateKeyFrameThumbnailTypeEnum(napi_env env);
268 
269     EXPORT static napi_value JSGetSmartAlbums(napi_env env, napi_callback_info info);
270     EXPORT static napi_value JSGetPrivateAlbum(napi_env env, napi_callback_info info);
271     EXPORT static napi_value JSCreateSmartAlbum(napi_env env, napi_callback_info info);
272     EXPORT static napi_value JSDeleteSmartAlbum(napi_env env, napi_callback_info info);
273 
274     EXPORT static napi_value JSStoreMediaAsset(napi_env env, napi_callback_info info);
275     EXPORT static napi_value JSStartImagePreview(napi_env env, napi_callback_info info);
276     EXPORT static napi_value JSGetMediaRemoteStub(napi_env env, napi_callback_info info);
277 
278     EXPORT static napi_value GetUserFileMgr(napi_env env, napi_callback_info info);
279     EXPORT static napi_value GetUserFileMgrAsync(napi_env env, napi_callback_info info);
280     EXPORT static napi_value UserFileMgrCreatePhotoAsset(napi_env env, napi_callback_info info);
281     EXPORT static napi_value UserFileMgrCreateAudioAsset(napi_env env, napi_callback_info info);
282     EXPORT static napi_value UserFileMgrDeleteAsset(napi_env env, napi_callback_info info);
283     EXPORT static napi_value UserFileMgrTrashAsset(napi_env env, napi_callback_info info);
284     EXPORT static napi_value JSGetPhotoAlbums(napi_env env, napi_callback_info info);
285     EXPORT static napi_value JSGetPhotoAssets(napi_env env, napi_callback_info info);
286     EXPORT static napi_value JSGetJsonPhotoAssets(napi_env env, napi_callback_info info);
287     EXPORT static napi_value JSGetAudioAssets(napi_env env, napi_callback_info info);
288     EXPORT static napi_value UserFileMgrGetPrivateAlbum(napi_env env, napi_callback_info info);
289     EXPORT static napi_value UserFileMgrCreateFileKeyEnum(napi_env env);
290     EXPORT static napi_value UserFileMgrOnCallback(napi_env env, napi_callback_info info);
291     EXPORT static napi_value UserFileMgrOffCallback(napi_env env, napi_callback_info info);
292     EXPORT static napi_value CreateAudioKeyEnum(napi_env env);
293     EXPORT static napi_value CreateImageVideoKeyEnum(napi_env env);
294     EXPORT static napi_value CreateAlbumKeyEnum(napi_env env);
295     EXPORT static napi_value CreatePositionTypeEnum(napi_env env);
296     EXPORT static napi_value CreatePhotoSubTypeEnum(napi_env env);
297     EXPORT static napi_value CreatePhotoPermissionTypeEnum(napi_env env);
298     EXPORT static napi_value CreateHideSensitiveTypeEnum(napi_env env);
299     EXPORT static napi_value CreateDynamicRangeTypeEnum(napi_env env);
300 
301     EXPORT static napi_value GetPhotoAccessHelper(napi_env env, napi_callback_info info);
302     EXPORT static napi_value StartPhotoPicker(napi_env env, napi_callback_info info);
303     EXPORT static napi_value GetPhotoAccessHelperAsync(napi_env env, napi_callback_info info);
304     EXPORT static napi_value CreateDeleteRequest(napi_env env, napi_callback_info info);
305     EXPORT static napi_value CheckShortTermPermission(napi_env env, napi_callback_info info);
306     EXPORT static napi_value CreateAssetsHasPermission(napi_env env, napi_callback_info info);
307     EXPORT static napi_value CreateAssetWithShortTermPermission(napi_env env, napi_callback_info info);
308     EXPORT static napi_value CreateAssetsForAppWithAlbum(napi_env env, napi_callback_info info);
309     EXPORT static napi_value ShowAssetsCreationDialog(napi_env env, napi_callback_info info);
310     EXPORT static napi_value RequestPhotoUrisReadPermission(napi_env env, napi_callback_info info);
311     EXPORT static napi_value PhotoAccessHelperCreatePhotoAsset(napi_env env, napi_callback_info info);
312     EXPORT static napi_value PhotoAccessHelperAgentCreateAssets(napi_env env, napi_callback_info info);
313     EXPORT static napi_value PhotoAccessHelperAgentCreateAssetsWithMode(napi_env env, napi_callback_info info);
314     EXPORT static napi_value PhotoAccessGrantPhotoUriPermission(napi_env env, napi_callback_info info);
315     EXPORT static napi_value PhotoAccessGrantPhotoUrisPermission(napi_env env, napi_callback_info info);
316     EXPORT static napi_value PhotoAccessCancelPhotoUriPermission(napi_env env, napi_callback_info info);
317     EXPORT static napi_value PhotoAccessHelperTrashAsset(napi_env env, napi_callback_info info);
318     EXPORT static napi_value PhotoAccessHelperOnCallback(napi_env env, napi_callback_info info);
319     EXPORT static napi_value PhotoAccessHelperOffCallback(napi_env env, napi_callback_info info);
320     EXPORT static napi_value PhotoAccessGetPhotoAssets(napi_env env, napi_callback_info info);
321     EXPORT static napi_value PhotoAccessGetPhotoAssetsSync(napi_env env, napi_callback_info info);
322     EXPORT static napi_value PhotoAccessCreatePhotoAlbum(napi_env env, napi_callback_info info);
323     EXPORT static napi_value PhotoAccessDeletePhotoAlbums(napi_env env, napi_callback_info info);
324     EXPORT static napi_value PhotoAccessGetPhotoAlbums(napi_env env, napi_callback_info info);
325     EXPORT static napi_value PhotoAccessGetPhotoAlbumsSync(napi_env env, napi_callback_info info);
326     EXPORT static napi_value PhotoAccessSaveFormInfo(napi_env env, napi_callback_info info);
327     EXPORT static napi_value PhotoAccessSaveGalleryFormInfo(napi_env env, napi_callback_info info);
328     EXPORT static napi_value PhotoAccessRemoveFormInfo(napi_env env, napi_callback_info info);
329     EXPORT static napi_value PhotoAccessRemoveGalleryFormInfo(napi_env env, napi_callback_info info);
330     EXPORT static napi_value PhotoAccessUpdateGalleryFormInfo(napi_env env, napi_callback_info info);
331     EXPORT static napi_value PhotoAccessGetFileAssetsInfo(napi_env env, napi_callback_info info);
332     EXPORT static napi_value PhotoAccessStartCreateThumbnailTask(napi_env env, napi_callback_info info);
333     EXPORT static napi_value PhotoAccessStopCreateThumbnailTask(napi_env env, napi_callback_info info);
334     EXPORT static napi_value PhotoAccessGetBurstAssets(napi_env env, napi_callback_info info);
335     EXPORT static napi_value PhotoAccessHelperGetDataAnalysisProgress(napi_env env, napi_callback_info info);
336     EXPORT static napi_value PhotoAccessHelperGetAnalysisData(napi_env env, napi_callback_info info);
337     EXPORT static napi_value PhotoAccessGetSharedPhotoAssets(napi_env env, napi_callback_info info);
338     EXPORT static napi_value PhotoAccessHelperSetForceHideSensitiveType(napi_env env, napi_callback_info info);
339     EXPORT static napi_value PhotoAccessStartAssetAnalysis(napi_env env, napi_callback_info info);
340 
341     EXPORT static napi_value SetHidden(napi_env env, napi_callback_info info);
342     EXPORT static napi_value PahGetHiddenAlbums(napi_env env, napi_callback_info info);
343 
344     EXPORT static napi_value CreateAlbumTypeEnum(napi_env env);
345     EXPORT static napi_value CreateAlbumSubTypeEnum(napi_env env);
346     EXPORT static napi_value CreateNotifyTypeEnum(napi_env env);
347     EXPORT static napi_value CreateDefaultChangeUriEnum(napi_env env);
348     EXPORT static napi_value CreateAnalysisTypeEnum(napi_env env);
349     EXPORT static napi_value CreateRequestPhotoTypeEnum(napi_env env);
350     EXPORT static napi_value CreateResourceTypeEnum(napi_env env);
351     EXPORT static napi_value CreateAuthorizationModeEnum(napi_env env);
352     EXPORT static napi_value CreateHighlightAlbumInfoTypeEnum(napi_env env);
353     EXPORT static napi_value CreateHighlightUserActionTypeEnum(napi_env env);
354     EXPORT static napi_value CreateMovingPhotoEffectModeEnum(napi_env env);
355     EXPORT static napi_value CreateImageFileTypeEnum(napi_env env);
356     EXPORT static napi_value CreateCloudEnhancementTaskStageEnum(napi_env env);
357     EXPORT static napi_value CreateCloudEnhancementStateEnum(napi_env env);
358     EXPORT static napi_value CreateSupportedWatermarkTypeEnum(napi_env env);
359     EXPORT static napi_value CreateVideoEnhancementTypeEnum(napi_env env);
360     EXPORT static napi_value CreateCloudMediaDownloadTypeEnum(napi_env env);
361     EXPORT static napi_value CreateCloudMediaRetainTypeEnum(napi_env env);
362     EXPORT static napi_value CreateCloudMediaAssetTaskStatusEnum(napi_env env);
363     EXPORT static napi_value CreateCloudMediaTaskPauseCauseEnum(napi_env env);
364 
365     EXPORT static napi_value CreatePhotoAlbum(napi_env env, napi_callback_info info);
366     EXPORT static napi_value DeletePhotoAlbums(napi_env env, napi_callback_info info);
367     EXPORT static napi_value GetPhotoAlbums(napi_env env, napi_callback_info info);
368     EXPORT static napi_value JSGetPhotoIndex(napi_env env, napi_callback_info info);
369     EXPORT static napi_value PhotoAccessGetPhotoIndex(napi_env env, napi_callback_info info);
370     EXPORT static napi_value PhotoAccessGetIndexConstructProgress(napi_env env, napi_callback_info info);
371     EXPORT static napi_value PhotoAccessGetSupportedPhotoFormats(napi_env env, napi_callback_info info);
372 
373     EXPORT static napi_value JSApplyChanges(napi_env env, napi_callback_info info);
374 
375     int32_t GetListenerType(const std::string &str) const;
376     void RegisterChange(napi_env env, const std::string &type, ChangeListenerNapi &listObj);
377     void UnregisterChange(napi_env env, const std::string &type, ChangeListenerNapi &listObj);
378     void RegisterNotifyChange(napi_env env,
379         const std::string &uri, bool isDerived, napi_ref ref, ChangeListenerNapi &listObj);
380     void UnRegisterNotifyChange(napi_env env, const std::string &uri, napi_ref ref, ChangeListenerNapi &listObj);
381     static bool CheckRef(napi_env env,
382         napi_ref ref, ChangeListenerNapi &listObj, bool isOff, const std::string &uri);
383     napi_env env_;
384     int32_t userId_ = -1;
385 
386     static thread_local napi_ref sConstructor_;
387     static thread_local napi_ref userFileMgrConstructor_;
388     static thread_local napi_ref photoAccessHelperConstructor_;
389     static thread_local napi_ref sMediaTypeEnumRef_;
390     static thread_local napi_ref sKeyFrameThumbnailTypeRef_;
391     static thread_local napi_ref sDirectoryEnumRef_;
392     static thread_local napi_ref sVirtualAlbumTypeEnumRef_;
393     static thread_local napi_ref sFileKeyEnumRef_;
394     static thread_local napi_ref sPrivateAlbumEnumRef_;
395 
396     static thread_local napi_ref sUserFileMgrFileKeyEnumRef_;
397     static thread_local napi_ref sAudioKeyEnumRef_;
398     static thread_local napi_ref sImageVideoKeyEnumRef_;
399     static thread_local napi_ref sPhotoKeysEnumRef_;
400     static thread_local napi_ref sAlbumKeyEnumRef_;
401     static thread_local napi_ref sAlbumType_;
402     static thread_local napi_ref sAlbumSubType_;
403     static thread_local napi_ref sPositionTypeEnumRef_;
404     static thread_local napi_ref sHiddenPhotosDisplayModeEnumRef_;
405     static thread_local napi_ref sPhotoSubType_;
406     static thread_local napi_ref sPhotoPermissionType_;
407     static thread_local napi_ref sHideSensitiveType_;
408     static thread_local napi_ref sDynamicRangeType_;
409     static thread_local napi_ref sNotifyType_;
410     static thread_local napi_ref sDefaultChangeUriRef_;
411     static thread_local napi_ref sAnalysisType_;
412     static thread_local napi_ref sRequestPhotoTypeEnumRef_;
413     static thread_local napi_ref sResourceTypeEnumRef_;
414     static thread_local napi_ref sDeliveryModeEnumRef_;
415     static thread_local napi_ref sSourceModeEnumRef_;
416     static thread_local napi_ref sCompatibleModeEnumRef_;
417     static thread_local napi_ref sHighlightAlbumInfoType_;
418     static thread_local napi_ref sHighlightUserActionType_;
419     static thread_local napi_ref sMovingPhotoEffectModeEnumRef_;
420     static thread_local napi_ref sImageFileTypeEnumEnumRef_;
421     static thread_local napi_ref sCloudEnhancementTaskStageEnumRef_;
422     static thread_local napi_ref sCloudEnhancementStateEnumRef_;
423     static thread_local napi_ref sAuthorizationModeEnumRef_;
424     static thread_local napi_ref sSupportedWatermarkTypeEnumRef_;
425     static thread_local napi_ref sVideoEnhancementTypeEnumRef_;
426     static thread_local napi_ref sCloudMediaDownloadTypeEnumRef_;
427     static thread_local napi_ref sCloudMediaRetainTypeEnumRef_;
428     static thread_local napi_ref sCloudMediaAssetTaskStatusEnumRef_;
429     static thread_local napi_ref sCloudMediaTaskPauseCauseEnumRef_;
430 
431     static std::mutex sOnOffMutex_;
432 };
433 
434 struct PickerCallBack {
435     bool ready = false;
436     bool isOrigin;
437     int32_t resultCode;
438     vector<string> uris;
439 };
440 
441 constexpr int32_t DEFAULT_PRIVATEALBUMTYPE = 3;
442 struct MediaLibraryAsyncContext : public NapiError {
443     napi_async_work work;
444     napi_deferred deferred;
445     napi_ref callbackRef;
446     bool status;
447     bool isDelete;
448     bool isCreateByComponent;
449     bool isCreateByAgent;
450     bool needSystemApp = false;
451     NapiAssetType assetType;
452     AlbumType albumType;
453     MediaLibraryNapi *objectInfo;
454     std::string selection;
455     std::vector<std::string> selectionArgs;
456     std::string order;
457     std::string uri;
458     std::vector<std::string> uriArray;
459     std::string networkId;
460     std::string extendArgs;
461     std::string analysisProgress;
462     int32_t analysisType = AnalysisType::ANALYSIS_INVALID;
463     std::unique_ptr<FetchResult<FileAsset>> fetchFileResult;
464     std::unique_ptr<FetchResult<AlbumAsset>> fetchAlbumResult;
465     std::unique_ptr<FetchResult<PhotoAlbum>> fetchPhotoAlbumResult;
466     std::unique_ptr<FetchResult<SmartAlbumAsset>> fetchSmartAlbumResult;
467     std::unique_ptr<FileAsset> fileAsset;
468     std::unique_ptr<PhotoAlbum> photoAlbumData;
469     std::unique_ptr<SmartAlbumAsset> smartAlbumData;
470     OHOS::DataShare::DataShareValuesBucket valuesBucket;
471     std::vector<OHOS::DataShare::DataShareValuesBucket> valuesBucketArray;
472     unsigned int dirType = 0;
473     int32_t privateAlbumType = DEFAULT_PRIVATEALBUMTYPE;
474     int32_t retVal;
475     std::string directoryRelativePath;
476     std::vector<std::unique_ptr<AlbumAsset>> albumNativeArray;
477     std::vector<std::unique_ptr<SmartAlbumAsset>> smartAlbumNativeArray;
478     std::vector<std::unique_ptr<SmartAlbumAsset>> privateSmartAlbumNativeArray;
479     Ability *ability_;
480     std::string storeMediaSrc;
481     int32_t imagePreviewIndex;
482     int32_t parentSmartAlbumId = 0;
483     int32_t smartAlbumId = -1;
484     int32_t isLocationAlbum = 0;
485     int32_t isHighlightAlbum = 0;
486     size_t argc;
487     napi_value argv[NAPI_ARGC_MAX];
488     ResultNapiType resultNapiType;
489     std::string tableName;
490     std::vector<uint32_t> mediaTypes;
491     std::vector<string> mediaTypeNames;
492     int32_t photoType;
493     OHOS::DataShare::DataSharePredicates predicates;
494     std::vector<std::string> fetchColumn;
495     std::vector<std::string> uris;
496     bool isForce = false;
497     bool hiddenOnly = false;
498     bool isAnalysisAlbum = false;
499     int32_t hiddenAlbumFetchMode = -1;
500     std::string formId;
501     std::string indexProgress;
502     std::shared_ptr<PickerCallBack> pickerCallBack;
503     std::vector<std::string> analysisDatas;
504     uint32_t tokenId;
505     std::vector<std::string> albumIds;
506     std::unordered_map<int32_t, unique_ptr<PhotoAlbum>> albumMap;
507     bool isContainsAlbumUri = false;
508     int32_t taskId = -1;
509     bool isFullAnalysis = false;
510 };
511 
512 struct MediaLibraryInitContext : public NapiError  {
513     napi_async_work work;
514     napi_deferred deferred;
515     napi_ref callbackRef;
516     size_t argc;
517     napi_value argv[NAPI_ARGC_MAX];
518     napi_ref resultRef_;
519     sptr<IRemoteObject> token_;
520 };
521 } // namespace Media
522 } // namespace OHOS
523 
524 #endif  // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_MEDIA_LIBRARY_NAPI_H_
525