diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_subscriber.h b/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_subscriber.h index 139e1a9f162c9bac654c21a5e3bac0e3ab8c590b..0f03d7253ed6b521fa6834cd97d2c63999169bdd 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_subscriber.h +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_subscriber.h @@ -35,8 +35,8 @@ public: private: static const std::vector events_; - bool isScreenOff_; - bool isCharging_; + bool isScreenOff_ {false}; + bool isCharging_ {false}; int32_t agingCount_; int64_t lockTime_; EXPORT void DoBackgroundOperation(); diff --git a/frameworks/services/media_thumbnail/include/thumbnail_generate_helper.h b/frameworks/services/media_thumbnail/include/thumbnail_generate_helper.h index 14a81df9f766a94db3a36700f152e45eaf2475b9..987447a2a0c4549a34369fe7dddbfbe59a112a4e 100644 --- a/frameworks/services/media_thumbnail/include/thumbnail_generate_helper.h +++ b/frameworks/services/media_thumbnail/include/thumbnail_generate_helper.h @@ -31,12 +31,14 @@ public: static int32_t CreateAstcBatch(ThumbRdbOpt &opts); static int32_t CreateLcdBatch(ThumbRdbOpt &opts); static int32_t GetNewThumbnailCount(ThumbRdbOpt &opts, const int64_t &time, int &count); - static int32_t GetThumbnailPixelMap(ThumbRdbOpt &opts, const Size &size, ThumbnailType thumbType); + static int32_t GetThumbnailPixelMap(ThumbRdbOpt &opts, ThumbnailType thumbType); private: static int32_t GetLcdCount(ThumbRdbOpt &opts, int &outLcdCount); static int32_t GetNoLcdData(ThumbRdbOpt &opts, int LcdLimit, std::vector &outDatas); static int32_t GetNoThumbnailData(ThumbRdbOpt &opts, std::vector &outDatas); static int32_t GetNoAstcData(ThumbRdbOpt &opts, std::vector &outDatas); + static int32_t GetAvailableFile(ThumbRdbOpt &opts, ThumbnailData &data, ThumbnailType thumbType, + std::string &fileName); }; } // namespace Media } // namespace OHOS diff --git a/frameworks/services/media_thumbnail/src/thumbnail_generate_helper.cpp b/frameworks/services/media_thumbnail/src/thumbnail_generate_helper.cpp index 8dd6a81bb55ca27ec121db02da289c43d1544723..dc86269265229272aa6a4479848627eedb724884 100644 --- a/frameworks/services/media_thumbnail/src/thumbnail_generate_helper.cpp +++ b/frameworks/services/media_thumbnail/src/thumbnail_generate_helper.cpp @@ -21,6 +21,7 @@ #include "dfx_const.h" #include "dfx_manager.h" #include "dfx_timer.h" +#include "dfx_utils.h" #include "ithumbnail_helper.h" #include "medialibrary_errno.h" #include "medialibrary_kvstore_manager.h" @@ -198,26 +199,51 @@ int32_t ThumbnailGenerateHelper::GetNewThumbnailCount(ThumbRdbOpt &opts, const i return E_OK; } -int32_t ThumbnailGenerateHelper::GetThumbnailPixelMap(ThumbRdbOpt &opts, const Size &size, ThumbnailType thumbType) +int32_t ThumbnailGenerateHelper::GetAvailableFile(ThumbRdbOpt &opts, ThumbnailData &data, ThumbnailType thumbType, + std::string &fileName) +{ + string thumbSuffix = GetThumbSuffix(thumbType); + fileName = GetThumbnailPath(data.path, thumbSuffix); + if (thumbType == ThumbnailType::THUMB_ASTC) { + // Try to get jpeg thumbnail instead if there is no astc file + if (access(fileName.c_str(), F_OK) == 0) { + return E_OK; + } else { + fileName = GetThumbnailPath(data.path, GetThumbSuffix(ThumbnailType::THUMB)); + } + } + + // No need to create thumbnails if corresponding file exists + if (access(fileName.c_str(), F_OK) == 0) { + return E_OK; + } + + MEDIA_INFO_LOG("No available file, create thumbnail, path: %{public}s", fileName.c_str()); + if (thumbType == ThumbnailType::LCD && !IThumbnailHelper::DoCreateLcd(opts, data)) { + MEDIA_ERR_LOG("Get lcd thumbnail pixelmap, doCreateLcd failed: %{public}s", fileName.c_str()); + return E_THUMBNAIL_LOCAL_CREATE_FAIL; + } else if (!IThumbnailHelper::DoCreateThumbnail(opts, data)) { + MEDIA_ERR_LOG("Get default thumbnail pixelmap, doCreateThumbnail failed: %{public}s", fileName.c_str()); + return E_THUMBNAIL_LOCAL_CREATE_FAIL; + } + if (!opts.path.empty()) { + fileName = GetThumbnailPath(data.path, thumbSuffix); + } + return E_OK; +} + +int32_t ThumbnailGenerateHelper::GetThumbnailPixelMap(ThumbRdbOpt &opts, ThumbnailType thumbType) { ThumbnailWait thumbnailWait(false); thumbnailWait.CheckAndWait(opts.row, thumbType == ThumbnailType::LCD); ThumbnailData thumbnailData; ThumbnailUtils::GetThumbnailInfo(opts, thumbnailData); - string thumbSuffix = GetThumbSuffix(thumbType); - string fileName = GetThumbnailPath(thumbnailData.path, thumbSuffix); - if (access(fileName.c_str(), F_OK) != 0) { - if (thumbType == ThumbnailType::LCD && !IThumbnailHelper::DoCreateLcd(opts, thumbnailData)) { - MEDIA_ERR_LOG("get lcd thumbnail pixelmap, doCreateThumbnail %{public}s", fileName.c_str()); - return E_THUMBNAIL_LOCAL_CREATE_FAIL; - } else if (!IThumbnailHelper::DoCreateThumbnail(opts, thumbnailData)) { - MEDIA_ERR_LOG("get default thumbnail pixelmap, doCreateThumbnail %{public}s", fileName.c_str()); - return E_THUMBNAIL_LOCAL_CREATE_FAIL; - } - } - if (!opts.path.empty()) { - fileName = GetThumbnailPath(thumbnailData.path, thumbSuffix); + string fileName; + int err = GetAvailableFile(opts, thumbnailData, thumbType, fileName); + if (err != E_OK) { + MEDIA_ERR_LOG("GetAvailableFile failed, path: %{public}s", DfxUtils::GetSafePath(thumbnailData.path).c_str()); + return err; } DfxTimer dfxTimer(thumbType == ThumbnailType::LCD ? DfxType::CLOUD_LCD_OPEN : DfxType::CLOUD_DEFAULT_OPEN, @@ -229,7 +255,6 @@ int32_t ThumbnailGenerateHelper::GetThumbnailPixelMap(ThumbRdbOpt &opts, const S thumbType == ThumbnailType::LCD ? DfxType::CLOUD_LCD_OPEN : DfxType::CLOUD_DEFAULT_OPEN, -errno); return -errno; } - int err; if (thumbType == ThumbnailType::LCD && opts.table == PhotoColumn::PHOTOS_TABLE) { ThumbnailUtils::UpdateVisitTime(opts, thumbnailData, err); } diff --git a/frameworks/services/media_thumbnail/src/thumbnail_service.cpp b/frameworks/services/media_thumbnail/src/thumbnail_service.cpp index 54b1d6db0822412d0d93f17026f43c963ca052a6..364a9478b02da2e48648e394cf770d9bbb767767 100644 --- a/frameworks/services/media_thumbnail/src/thumbnail_service.cpp +++ b/frameworks/services/media_thumbnail/src/thumbnail_service.cpp @@ -174,7 +174,7 @@ int ThumbnailService::GetThumbFd(const string &path, const string &table, const if (thumbType != ThumbnailType::THUMB && thumbType != ThumbnailType::THUMB_ASTC) { opts.screenSize = screenSize_; } - int fd = ThumbnailGenerateHelper::GetThumbnailPixelMap(opts, size, thumbType); + int fd = ThumbnailGenerateHelper::GetThumbnailPixelMap(opts, thumbType); if (fd < 0) { VariantMap map = {{KEY_ERR_FILE, __FILE__}, {KEY_ERR_LINE, __LINE__}, {KEY_ERR_CODE, fd}, {KEY_OPT_FILE, uri}, {KEY_OPT_TYPE, OptType::THUMB}}; diff --git a/frameworks/services/media_thumbnail/src/thumbnail_utils.cpp b/frameworks/services/media_thumbnail/src/thumbnail_utils.cpp index 1cca2241b1234b51cc4fa4e2e4f7ea9bfa1f5208..b7d4b8ace78b937c79399c4bba60021b67f09cd6 100644 --- a/frameworks/services/media_thumbnail/src/thumbnail_utils.cpp +++ b/frameworks/services/media_thumbnail/src/thumbnail_utils.cpp @@ -1365,7 +1365,7 @@ int ThumbnailUtils::TrySaveFile(ThumbnailData &data, ThumbnailType type) { string suffix; uint8_t *output; - int writeSize; + uint32_t writeSize; switch (type) { case ThumbnailType::THUMB: suffix = THUMBNAIL_THUMB_SUFFIX;