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