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