From 7e183377f4bdb699bb1f709a588be32ab8821bb4 Mon Sep 17 00:00:00 2001 From: lumingfei0525 Date: Fri, 10 Nov 2023 16:35:46 +0800 Subject: [PATCH] Description:add analysis data interface of napi Signed-off-by: lumingfei0525 --- .../media_library_helper/src/photo_album.cpp | 6 +- .../src/photo_album_column.cpp | 12 +++ .../include/medialibrary_command.h | 2 + .../include/medialibrary_object_utils.h | 1 + .../include/medialibrary_rdb_utils.h | 2 + .../src/medialibrary_album_operations.cpp | 16 +++- .../src/medialibrary_asset_operations.cpp | 1 + .../src/medialibrary_command.cpp | 6 ++ .../src/medialibrary_data_manager.cpp | 10 +-- .../src/medialibrary_object_utils.cpp | 10 +++ .../src/medialibrary_photo_operations.cpp | 5 ++ .../src/medialibrary_rdb_utils.cpp | 70 +++++++++++++++- .../src/medialibrary_rdbstore.cpp | 20 ++++- frameworks/js/src/file_asset_napi.cpp | 81 +++++++++++++++++++ frameworks/js/src/media_library_napi.cpp | 22 ++++- frameworks/js/src/medialibrary_napi_utils.cpp | 63 +++++++++++++++ frameworks/js/src/photo_album_napi.cpp | 5 ++ frameworks/js/src/photoaccesshelperinf.js | 1 + .../utils/include/userfile_manager_types.h | 14 +++- frameworks/utils/include/userfilemgr_uri.h | 13 +++ .../include/medialibrary_db_const.h | 3 +- .../include/photo_album_column.h | 2 + .../include/vision_column.h | 33 +++++++- interfaces/kits/js/BUILD.gn | 1 + interfaces/kits/js/include/file_asset_napi.h | 3 + .../kits/js/include/media_library_napi.h | 1 + .../kits/js/include/medialibrary_napi_utils.h | 7 ++ 27 files changed, 394 insertions(+), 16 deletions(-) diff --git a/frameworks/innerkitsimpl/media_library_helper/src/photo_album.cpp b/frameworks/innerkitsimpl/media_library_helper/src/photo_album.cpp index 5ccd3ade1b..8d4ce79581 100644 --- a/frameworks/innerkitsimpl/media_library_helper/src/photo_album.cpp +++ b/frameworks/innerkitsimpl/media_library_helper/src/photo_album.cpp @@ -154,13 +154,15 @@ bool PhotoAlbum::IsTrashAlbum(const PhotoAlbumType albumType, const PhotoAlbumSu bool PhotoAlbum::CheckPhotoAlbumType(const PhotoAlbumType albumType) { - return (albumType == PhotoAlbumType::USER) || (albumType == PhotoAlbumType::SYSTEM); + return (albumType == PhotoAlbumType::USER) || (albumType == PhotoAlbumType::SYSTEM) || + (albumType == PhotoAlbumType::SMART); } bool PhotoAlbum::CheckPhotoAlbumSubType(const PhotoAlbumSubType albumSubType) { return (albumSubType == PhotoAlbumSubType::USER_GENERIC) || (albumSubType == PhotoAlbumSubType::ANY) || - ((albumSubType >= PhotoAlbumSubType::SYSTEM_START) && (albumSubType <= PhotoAlbumSubType::SYSTEM_END)); + ((albumSubType >= PhotoAlbumSubType::SYSTEM_START) && (albumSubType <= PhotoAlbumSubType::SYSTEM_END)) || + ((albumSubType >= PhotoAlbumSubType::ANALYSIS_START) && (albumSubType < PhotoAlbumSubType::ANALYSIS_END)); } } // namespace Media } // namespace OHOS diff --git a/frameworks/innerkitsimpl/media_library_helper/src/photo_album_column.cpp b/frameworks/innerkitsimpl/media_library_helper/src/photo_album_column.cpp index f82cfaf46f..c6501359b6 100644 --- a/frameworks/innerkitsimpl/media_library_helper/src/photo_album_column.cpp +++ b/frameworks/innerkitsimpl/media_library_helper/src/photo_album_column.cpp @@ -20,6 +20,7 @@ #include "media_log.h" #include "medialibrary_type_const.h" #include "photo_map_column.h" +#include "vision_column.h" namespace OHOS::Media { using namespace std; @@ -140,6 +141,17 @@ void PhotoAlbumColumns::GetUserAlbumPredicates(const int32_t albumId, RdbPredica predicates.EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0)); } +void PhotoAlbumColumns::GetAnalysisAlbumPredicates(const int32_t albumId, RdbPredicates &predicates, const bool hiddenState) +{ + string onClause = MediaColumn::MEDIA_ID + " = " + PhotoMap::ASSET_ID; + predicates.InnerJoin(ANALYSIS_PHOTO_MAP_TABLE)->On({ onClause }); + predicates.EqualTo(PhotoMap::ALBUM_ID, to_string(albumId)); + predicates.EqualTo(PhotoColumn::PHOTO_SYNC_STATUS, to_string(static_cast(SyncStatusType::TYPE_VISIBLE))); + predicates.EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0)); + predicates.EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(hiddenState)); + predicates.EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0)); +} + static void GetFavoritePredicates(RdbPredicates &predicates, const bool hiddenState) { predicates.BeginWrap(); diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_command.h b/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_command.h index eded2bfa75..c291a15840 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_command.h +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_command.h @@ -65,6 +65,8 @@ enum class OperationObject : uint32_t { VISION_SHIELD, // Vision end GEO_DICTIONARY, GEO_KNOWLEDGE, + ANALYSIS_PHOTO_ALBUM, + ANALYSIS_PHOTO_MAP, }; enum class OperationType : uint32_t { diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_object_utils.h b/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_object_utils.h index c0cc3710e6..8807327e2c 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_object_utils.h +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_object_utils.h @@ -86,6 +86,7 @@ public: static void ScanFile(const std::string &srcPath, MediaLibraryApi api = MediaLibraryApi::API_OLD); static void InvalidateThumbnail(const string &id, const string &tableName = MEDIALIBRARY_TABLE, const string &path = ""); + static void UpdateAnalysisProp(const std::string str); private: static int32_t ModifyInfoByPathInDb(MediaLibraryCommand &cmd, const std::string &path); diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_rdb_utils.h b/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_rdb_utils.h index 57ff5dbc26..cd17787e15 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_rdb_utils.h +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_rdb_utils.h @@ -31,6 +31,8 @@ public: static void AddQueryFilter(NativeRdb::AbsRdbPredicates &predicates); static void UpdateHiddenAlbumInternal(const std::shared_ptr &rdbStore); + static void UpdateAnalysisAlbumInternal(const std::shared_ptr &rdbStore, + const std::vector &userAlbumIds = {}); }; } // namespace OHOS::Media #endif // OHOS_MEDIALIBRARY_RDB_UTILS_H diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_album_operations.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_album_operations.cpp index c6aa77fdbf..0f05c656c6 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_album_operations.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_album_operations.cpp @@ -388,7 +388,18 @@ int CreatePhotoAlbum(MediaLibraryCommand &cmd) if (err < 0) { return err; } - int rowId = CreatePhotoAlbum(albumName); + int rowId; + if (OperationObject::ANALYSIS_PHOTO_ALBUM == cmd.GetOprnObject()){ + auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore(); + if (rdbStore == nullptr) { + return E_HAS_DB_ERROR; + } + int64_t outRowId; + rdbStore->Insert(cmd, outRowId); + rowId = outRowId; + } else { + rowId = CreatePhotoAlbum(albumName); + } auto watch = MediaLibraryNotify::GetInstance(); if (rowId > 0) { watch->Notify(MediaFileUtils::GetUriByExtrConditions(PhotoAlbumColumns::ALBUM_URI_PREFIX, to_string(rowId)), @@ -402,6 +413,7 @@ int32_t MediaLibraryAlbumOperations::DeletePhotoAlbum(RdbPredicates &predicates) // Only user generic albums can be deleted predicates.And()->BeginWrap()->EqualTo(PhotoAlbumColumns::ALBUM_TYPE, to_string(PhotoAlbumType::USER)); predicates.EqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, to_string(PhotoAlbumSubType::USER_GENERIC)); + predicates.Or()->EqualTo(PhotoAlbumColumns::ALBUM_TYPE, to_string(PhotoAlbumType::SMART)); predicates.EndWrap(); int deleteRow = MediaLibraryRdbStore::Delete(predicates); @@ -461,6 +473,7 @@ int32_t UpdatePhotoAlbum(const ValuesBucket &values, const DataSharePredicates & // Only user generic albums can be updated rdbPredicates.And()->BeginWrap()->EqualTo(PhotoAlbumColumns::ALBUM_TYPE, to_string(PhotoAlbumType::USER)); rdbPredicates.EqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, to_string(PhotoAlbumSubType::USER_GENERIC)); + rdbPredicates.Or()->EqualTo(PhotoAlbumColumns::ALBUM_TYPE, to_string(PhotoAlbumType::SMART)); rdbPredicates.EndWrap(); int32_t changedRows = MediaLibraryRdbStore::Update(rdbValues, rdbPredicates); @@ -492,6 +505,7 @@ int32_t RecoverPhotoAssets(const DataSharePredicates &predicates) MediaLibraryRdbUtils::UpdateUserAlbumInternal(rdbStore); MediaLibraryRdbUtils::UpdateSystemAlbumInternal(rdbStore); MediaLibraryRdbUtils::UpdateHiddenAlbumInternal(rdbStore); + MediaLibraryRdbUtils::UpdateAnalysisAlbumInternal(rdbStore); auto watch = MediaLibraryNotify::GetInstance(); size_t count = whereArgs.size() - THAN_AGR_SIZE; diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_asset_operations.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_asset_operations.cpp index a88570654b..e2d8a89156 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_asset_operations.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_asset_operations.cpp @@ -1155,6 +1155,7 @@ static void UpdateAlbumsAndSendNotifyInTrash(AsyncTaskData *data) MediaLibraryRdbUtils::UpdateUserAlbumInternal(rdbStore); MediaLibraryRdbUtils::UpdateSystemAlbumInternal(rdbStore); MediaLibraryRdbUtils::UpdateHiddenAlbumInternal(rdbStore); + MediaLibraryRdbUtils::UpdateAnalysisAlbumInternal(rdbStore); auto watch = MediaLibraryNotify::GetInstance(); if (watch == nullptr) { diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_command.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_command.cpp index 9e4bca4039..7a99d4fe96 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_command.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_command.cpp @@ -290,6 +290,8 @@ void MediaLibraryCommand::ParseOprnObjectFromUri() { PAH_PHOTO, OperationObject::PAH_PHOTO }, { PAH_ALBUM, OperationObject::PAH_ALBUM }, { PAH_MAP, OperationObject::PAH_MAP }, + { PAH_ANA_ALBUM, OperationObject::ANALYSIS_PHOTO_ALBUM }, + { PAH_ANA_MAP, OperationObject::ANALYSIS_PHOTO_MAP }, { TOOL_PHOTO, OperationObject::TOOL_PHOTO }, { TOOL_AUDIO, OperationObject::TOOL_AUDIO }, @@ -313,6 +315,8 @@ void MediaLibraryCommand::ParseOprnObjectFromUri() { VISION_IMAGE_FACE_TABLE, OperationObject::VISION_IMAGE_FACE }, { VISION_FACE_TAG_TABLE, OperationObject::VISION_FACE_TAG }, { VISION_SHIELD_TABLE, OperationObject::VISION_SHIELD }, + { PAH_ANA_OCR, OperationObject::VISION_OCR }, + { PAH_ANA_ATTS, OperationObject::VISION_AESTHETICS }, // use in Location Analyse { GEO_DICTIONARY_TABLE, OperationObject::GEO_DICTIONARY }, @@ -394,6 +398,8 @@ static const map> TABLE_NAME_MAP = { { OperationObject::VISION_SHIELD, { { OperationType::UNKNOWN_TYPE, VISION_SHIELD_TABLE } } }, { OperationObject::GEO_DICTIONARY, { { OperationType::UNKNOWN_TYPE, GEO_DICTIONARY_TABLE } } }, { OperationObject::GEO_KNOWLEDGE, { { OperationType::UNKNOWN_TYPE, GEO_KNOWLEDGE_TABLE } } }, + { OperationObject::ANALYSIS_PHOTO_ALBUM, { { OperationType::UNKNOWN_TYPE, ANALYSIS_ALBUM_TABLE } } }, + { OperationObject::ANALYSIS_PHOTO_MAP, { { OperationType::UNKNOWN_TYPE, ANALYSIS_PHOTO_MAP_TABLE } } }, }; void MediaLibraryCommand::ParseTableName() diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_data_manager.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_data_manager.cpp index b2ebb33935..1269ebb60c 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_data_manager.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_data_manager.cpp @@ -392,6 +392,7 @@ int32_t MediaLibraryDataManager::SolveInsertCmd(MediaLibraryCommand &cmd) case OperationObject::FILESYSTEM_ALBUM: { return MediaLibraryAlbumOperations::CreateAlbumOperation(cmd); } + case OperationObject::ANALYSIS_PHOTO_ALBUM: case OperationObject::PHOTO_ALBUM: { return MediaLibraryAlbumOperations::HandlePhotoAlbumOperations(cmd); } @@ -410,6 +411,7 @@ int32_t MediaLibraryDataManager::SolveInsertCmd(MediaLibraryCommand &cmd) case OperationObject::BUNDLE_PERMISSION: { return UriPermissionOperations::HandleUriPermOperations(cmd); } + case OperationObject::ANALYSIS_PHOTO_MAP: case OperationObject::VISION_OCR: case OperationObject::VISION_LABEL: case OperationObject::VISION_AESTHETICS: @@ -970,15 +972,13 @@ shared_ptr MediaLibraryDataManager::QuerySet(MediaLibraryC queryResultSet = MediaLibraryAlbumOperations::QueryAlbumOperation(cmd, columns); } else if (oprnObject == OperationObject::PHOTO_ALBUM) { queryResultSet = MediaLibraryAlbumOperations::QueryPhotoAlbum(cmd, columns); - } else if (oprnObject == OperationObject::PHOTO_MAP) { + } else if (oprnObject == OperationObject::PHOTO_MAP || oprnObject == OperationObject::ANALYSIS_PHOTO_MAP) { queryResultSet = PhotoMapOperations::QueryPhotoAssets( RdbUtils::ToPredicates(predicates, PhotoColumn::PHOTOS_TABLE), columns); } else if (oprnObject == OperationObject::FILESYSTEM_PHOTO || oprnObject == OperationObject::FILESYSTEM_AUDIO) { queryResultSet = MediaLibraryAssetOperations::QueryOperation(cmd, columns); - } else if (oprnObject >= OperationObject::VISION_OCR && oprnObject <= OperationObject::VISION_SHIELD) { - queryResultSet = MediaLibraryVisionOperations::QueryOperation(cmd, columns); - } else if (oprnObject >= OperationObject::GEO_DICTIONARY && oprnObject <= OperationObject::GEO_KNOWLEDGE) { - queryResultSet = MediaLibraryLocationOperations::QueryOperation(cmd, columns); + } else if (oprnObject >= OperationObject::VISION_OCR && oprnObject <= OperationObject::ANALYSIS_PHOTO_ALBUM) { + queryResultSet = MediaLibraryRdbStore::Query(RdbUtils::ToPredicates(predicates, cmd.GetTableName(), columns); } else { tracer.Start("QueryFile"); queryResultSet = MediaLibraryFileOperations::QueryFileOperation(cmd, columns); diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_object_utils.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_object_utils.cpp index 4abb2b95ca..e913733097 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_object_utils.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_object_utils.cpp @@ -1593,6 +1593,16 @@ static int32_t GetRootDirAssetByRelativePath(const string &relativePath, DirAsse return E_SUCCESS; } +void MediaLibraryObjectUtils::UpdateAnalysisProp(const std::string value) +{ + int ret = SetParameter("persist.multimedia.media_analysis_service.hasdata", value.c_str()); + if (ret == 0) { + MEDIA_INFO_LOG("UpdateAnalysisProp succ"); + } else { + MEDIA_ERR_LOG("Failed to UpdateAnalysisProp, result:%{public}d", ret); + } +} + int32_t MediaLibraryObjectUtils::CheckDirExtension(const string &relativePath, const string &displayName) { if (relativePath.empty() || displayName.empty()) { diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_photo_operations.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_photo_operations.cpp index 9649cfe9d0..beb6879b24 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_photo_operations.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_photo_operations.cpp @@ -389,6 +389,7 @@ int32_t MediaLibraryPhotoOperations::CreateV9(MediaLibraryCommand& cmd) return E_HAS_DB_ERROR; } transactionOprn.Finish(); + MediaLibraryObjectUtils::UpdateAnalysisProp("0"); return outRow; } @@ -474,6 +475,7 @@ int32_t MediaLibraryPhotoOperations::CreateV10(MediaLibraryCommand& cmd) CHECK_AND_RETURN_RET(ret == E_OK, ret); } cmd.SetResult(fileUri); + MediaLibraryObjectUtils::UpdateAnalysisProp("0"); return outRow; } @@ -553,6 +555,7 @@ int32_t MediaLibraryPhotoOperations::TrashPhotos(MediaLibraryCommand &cmd) MediaLibraryRdbUtils::UpdateUserAlbumInternal(rdbStore->GetRaw()); MediaLibraryRdbUtils::UpdateSystemAlbumInternal(rdbStore->GetRaw()); MediaLibraryRdbUtils::UpdateHiddenAlbumInternal(rdbStore->GetRaw()); + MediaLibraryRdbUtils::UpdateAnalysisAlbumInternal(rdbStore->GetRaw()); if (static_cast(updatedRows) != notifyUris.size()) { MEDIA_WARN_LOG("Try to notify %{public}zu items, but only %{public}d items updated.", notifyUris.size(), updatedRows); @@ -640,6 +643,8 @@ static int32_t HidePhotos(MediaLibraryCommand &cmd) MediaLibraryRdbUtils::UpdateHiddenAlbumInternal( MediaLibraryUnistoreManager::GetInstance().GetRdbStoreRaw()->GetRaw()); + MediaLibraryRdbUtils::UpdateAnalysisAlbumInternal( + MediaLibraryUnistoreManager::GetInstance().GetRdbStoreRaw()->GetRaw()); SendHideNotify(notifyUris, hiddenState); return changedRows; } diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdb_utils.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdb_utils.cpp index d8ae21c708..a3de8516df 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdb_utils.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdb_utils.cpp @@ -26,6 +26,8 @@ #include "photo_album_column.h" #include "photo_map_column.h" #include "result_set.h" +#include "userfile_manager_types.h" +#include "vision_column.h" namespace OHOS::Media { using namespace std; @@ -87,6 +89,19 @@ static inline shared_ptr GetUserAlbum(const shared_ptrQuery(predicates, columns); } +static inline shared_ptr GetAnalysisAlbum(const shared_ptr &rdbStore, + const vector &analysisAlbumIds, const vector &columns) +{ + RdbPredicates predicates(ANALYSIS_ALBUM_TABLE); + if (!analysisAlbumIds.empty()) { + predicates.In(PhotoAlbumColumns::ALBUM_ID, analysisAlbumIds); + } + if (rdbStore == nullptr) { + return nullptr; + } + return rdbStore->Query(predicates, columns); +} + static string GetQueryFilter(const string &tableName) { if (tableName == MEDIALIBRARY_TABLE) { @@ -118,6 +133,9 @@ void MediaLibraryRdbUtils::AddQueryFilter(AbsRdbPredicates &predicates) string filters; for (auto &t : joinTables) { string filter = GetQueryFilter(t); + if (filter.empty()) { + continue; + } if (filters.empty()) { filters += filter; } else { @@ -320,10 +338,12 @@ static int32_t SetUpdateValues(const shared_ptr &rdbStore, }; RdbPredicates predicates(PhotoColumn::PHOTOS_TABLE); - if (subtype) { - PhotoAlbumColumns::GetSystemAlbumPredicates(subtype, predicates, hiddenState); - } else { + if (!subtype) { PhotoAlbumColumns::GetUserAlbumPredicates(GetAlbumId(albumResult), predicates, hiddenState); + } else if (subtype >= PhotoAlbumSubType::ANALYSIS_START && subtype < PhotoAlbumSubType::ANALYSIS_END) { + PhotoAlbumColumns::GetAnalysisAlbumPredicates(GetAlbumId(albumResult), predicates, hiddenState); + } else { + PhotoAlbumColumns::GetSystemAlbumPredicates(subtype, predicates, hiddenState); } predicates.IndexedBy(PhotoColumn::PHOTO_SHPT_ADDED_INDEX); auto fileResult = QueryGoToFirst(rdbStore, predicates, columns); @@ -362,6 +382,32 @@ static int32_t UpdateUserAlbumIfNeeded(const shared_ptr &rdbStore, con return E_SUCCESS; } +static int32_t UpdateAnalysisAlbumIfNeeded(const shared_ptr &rdbStore, const shared_ptr &albumResult, + const bool hiddenState) +{ + MediaLibraryTracer tracer; + tracer.Start("UpdateAnalysisAlbumIfNeeded"); + ValuesBucket values; + auto subtype = static_cast(GetAlbumSubType(albumResult)); + int err = SetUpdateValues(rdbStore, albumResult, values, subtype, hiddenState); + if (err < 0) { + return err; + } + if (values.IsEmpty()) { + return E_SUCCESS; + } + + RdbPredicates predicates(ANALYSIS_ALBUM_TABLE); + predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(GetAlbumId(albumResult))); + int32_t changedRows = 0; + err = rdbStore->Update(changedRows, values, predicates); + if (err < 0) { + MEDIA_WARN_LOG("Failed to update album count and cover! err: %{public}d", err); + return err; + } + return E_SUCCESS; +} + static int32_t UpdateSysAlbumIfNeeded(const shared_ptr &rdbStore, const shared_ptr &albumResult, const bool hiddenState) { @@ -405,6 +451,24 @@ void MediaLibraryRdbUtils::UpdateUserAlbumInternal(const shared_ptr &r ForEachRow(rdbStore, albumResult, false, UpdateUserAlbumIfNeeded); } +void MediaLibraryRdbUtils::UpdateAnalysisAlbumInternal(const shared_ptr &rdbStore, + const vector &anaAlbumAlbumIds) +{ + MediaLibraryTracer tracer; + tracer.Start("UpdateAnalysisAlbumInternal"); + vector columns = { + PhotoAlbumColumns::ALBUM_ID, + PhotoAlbumColumns::ALBUM_SUBTYPE, + PhotoAlbumColumns::ALBUM_COVER_URI, + PhotoAlbumColumns::ALBUM_COUNT, + }; + auto albumResult = GetAnalysisAlbum(rdbStore, anaAlbumAlbumIds, columns); + if (albumResult == nullptr) { + return; + } + ForEachRow(rdbStore, albumResult, false, UpdateAnalysisAlbumIfNeeded); +} + static inline shared_ptr GetSystemAlbum(const shared_ptr &rdbStore, const vector &subtypes, const vector &columns) { diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdbstore.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdbstore.cpp index c0ed44e79b..1ffc53fa05 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdbstore.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdbstore.cpp @@ -916,6 +916,8 @@ static const vector onCreateSqlStrs = { CREATE_IMAGE_FACE_INDEX, CREATE_GEO_KNOWLEDGE_TABLE, CREATE_GEO_DICTIONARY_TABLE, + CREATE_ANALYSIS_ALBUM, + CREATE_ANALYSIS_ALBUM_MAP, }; static int32_t ExecuteSql(RdbStore &store) @@ -1220,6 +1222,18 @@ static void AddFaceTables(RdbStore &store) ExecSqls(executeSqlStrs, store); } +static void AddAnalysisAlbum(RdbStore &store) +{ + static const vector executeSqlStrs = { + "ALTER TABLE tab_analysis_ocr ADD COLUMN width INT;", + "ALTER TABLE tab_analysis_ocr ADD COLUMN height INT;", + CREATE_ANALYSIS_ALBUM, + CREATE_ANALYSIS_ALBUM_MAP, + }; + MEDIA_INFO_LOG("start init vision album"); + ExecSqls(executeSqlStrs, store); +} + void MediaLibraryRdbStore::ResetAnalysisTables() { if (rdbStore_ == nullptr) { @@ -1238,7 +1252,7 @@ void MediaLibraryRdbStore::ResetAnalysisTables() "DROP TABLE IF EXISTS tab_analysis_image_face", "DROP TABLE IF EXISTS tab_analysis_face_tag", }; - MEDIA_INFO_LOG("start update analysis db"); + MEDIA_INFO_LOG("start update analysis table"); ExecSqls(executeSqlStrs, *rdbStore_); AddAnalysisTables(*rdbStore_); AddFaceTables(*rdbStore_); @@ -1684,6 +1698,10 @@ int32_t MediaLibraryDataCallBack::OnUpgrade(RdbStore &store, int32_t oldVersion, if (oldVersion < VERSION_ADD_FACE_TABLE) { AddFaceTables(store); } + + if (oldVersion < VERSION_ADD_VISION_ALBUM) { + AddAnalysisAlbum(store); + } return NativeRdb::E_OK; } diff --git a/frameworks/js/src/file_asset_napi.cpp b/frameworks/js/src/file_asset_napi.cpp index ec80d200d7..2d2a759126 100644 --- a/frameworks/js/src/file_asset_napi.cpp +++ b/frameworks/js/src/file_asset_napi.cpp @@ -55,6 +55,7 @@ #include "unique_fd.h" #include "userfile_client.h" #include "userfilemgr_uri.h" +#include "vision_column.h" using OHOS::HiviewDFX::HiLog; using OHOS::HiviewDFX::HiLogLabel; @@ -219,6 +220,7 @@ napi_value FileAssetNapi::PhotoAccessHelperInit(napi_env env, napi_value exports DECLARE_NAPI_FUNCTION("requestSource", PhotoAccessHelperRequestSource), DECLARE_NAPI_FUNCTION("commitEditedAsset", PhotoAccessHelperCommitEditedAsset), DECLARE_NAPI_FUNCTION("revertToOriginal", PhotoAccessHelperRevertToOriginal), + DECLARE_NAPI_FUNCTION("getAnalysisData", PhotoAccessHelperGetAnalysisData), } }; MediaLibraryNapiUtils::NapiDefineClass(env, exports, info); @@ -1779,6 +1781,34 @@ napi_value FileAssetNapi::JSGetThumbnail(napi_env env, napi_callback_info info) return result; } +static void JSGetAnalysisDataExecute(FileAssetAsyncContext* context) +{ + MediaLibraryTracer tracer; + tracer.Start("JSGetThumbnailExecute"); + std::vector fetchColumn; + string uriStr; + switch(context->analysisType) { + case ANALYSIS_OCR: + uriStr = PAH_QUERY_ANA_OCR; + fetchColumn = {OCR_TEXT, OCR_TEXT_MSG, OCR_PRE_MSG}; + break; + case ANALYSIS_AETSTHETICS_SCORE: + uriStr = PAH_QUERY_ANA_ATTS; + fetchColumn = {AESTHETICS_SCORE, PROB}; + break; + default: + NAPI_ERR_LOG("Invalid analysisType"); + return; + } + int fileId = context->objectInfo->GetFileId(); + Uri uri (uriStr); + DataShare::DataSharePredicates predicates; + predicates.EqualTo(MediaColumn::MEDIA_ID, to_string(fileId)); + int errCode = 0; + auto resultSet = UserFileClient::Query(uri, predicates, fetchColumn, errCode); + context->analysisData = MediaLibraryNapiUtils::ParseResultSet2JsonStr(resultSet, fetchColumn); +} + static void JSFavoriteCallbackComplete(napi_env env, napi_status status, void *data) { MediaLibraryTracer tracer; @@ -2799,6 +2829,34 @@ static void UserFileMgrOpenCallbackComplete(napi_env env, napi_status status, vo delete context; } +static void JSGetAnalysisDataCompleteCallback(napi_env env, napi_status status, void *data) +{ + MediaLibraryTracer tracer; + tracer.Start("JSGetAnalysisDataCompleteCallback"); + + auto *context = static_cast(data); + CHECK_NULL_PTR_RETURN_VOID(context, "Async context is null"); + + unique_ptr jsContext = make_unique(); + jsContext->status = false; + + CHECK_ARGS_RET_VOID(env, napi_get_undefined(env, &jsContext->data), JS_INNER_FAIL); + CHECK_ARGS_RET_VOID(env, napi_get_undefined(env, &jsContext->error), JS_INNER_FAIL); + if (context->error == ERR_DEFAULT) { + CHECK_ARGS_RET_VOID(env, napi_create_string_utf8(env, context->analysisData.c_str(), NAPI_AUTO_LENGTH, &jsContext->data), JS_INNER_FAIL); + jsContext->status = true; + } else { + context->HandleError(env, jsContext->error); + } + + tracer.Finish(); + if (context->work != nullptr) { + MediaLibraryNapiUtils::InvokeJSAsyncMethod(env, context->deferred, context->callbackRef, + context->work, *jsContext); + } + delete context; +} + napi_value FileAssetNapi::UserFileMgrOpen(napi_env env, napi_callback_info info) { unique_ptr asyncContext = make_unique(); @@ -3877,6 +3935,29 @@ napi_value FileAssetNapi::PhotoAccessHelperSetUserComment(napi_env env, napi_cal PhotoAccessHelperSetUserCommentExecute, PhotoAccessHelperSetUserCommentComplete); } +napi_value FileAssetNapi::PhotoAccessHelperGetAnalysisData(napi_env env, napi_callback_info info) +{ + MediaLibraryTracer tracer; + tracer.Start("PhotoAccessHelperGetAnalysisData"); + + napi_value result = nullptr; + NAPI_CALL(env, napi_get_undefined(env, &result)); + unique_ptr asyncContext = make_unique(); + CHECK_NULL_PTR_RETURN_UNDEFINED(env, asyncContext, result, "asyncContext context is null"); + + CHECK_ARGS(env, MediaLibraryNapiUtils::ParseArgsNumberCallback(env, info, asyncContext, asyncContext->analysisType), + JS_ERR_PARAMETER_INVALID); + asyncContext->objectPtr = asyncContext->objectInfo->fileAssetPtr; + CHECK_NULL_PTR_RETURN_UNDEFINED(env, asyncContext->objectPtr, result, "FileAsset is nullptr"); + asyncContext->resultNapiType = ResultNapiType::TYPE_PHOTOACCESS_HELPER; + return MediaLibraryNapiUtils::NapiCreateAsyncWork(env, asyncContext, "PhotoAccessHelperGetAnalysisData", + [](napi_env env, void *data) { + auto context = static_cast(data); + JSGetAnalysisDataExecute(context); + }, + reinterpret_cast(JSGetAnalysisDataCompleteCallback)); +} + static void UserFileMgrGetJsonExecute(napi_env env, void *data) { MediaLibraryTracer tracer; diff --git a/frameworks/js/src/media_library_napi.cpp b/frameworks/js/src/media_library_napi.cpp index 843958cd1f..8b9612d839 100644 --- a/frameworks/js/src/media_library_napi.cpp +++ b/frameworks/js/src/media_library_napi.cpp @@ -256,7 +256,8 @@ napi_value MediaLibraryNapi::PhotoAccessHelperInit(napi_env env, napi_value expo DECLARE_NAPI_PROPERTY("PhotoSubtype", CreatePhotoSubTypeEnum(env)), DECLARE_NAPI_PROPERTY("NotifyType", CreateNotifyTypeEnum(env)), DECLARE_NAPI_PROPERTY("DefaultChangeUri", CreateDefaultChangeUriEnum(env)), - DECLARE_NAPI_PROPERTY("HiddenPhotosDisplayMode", CreateHiddenPhotosDisplayModeEnum(env)) + DECLARE_NAPI_PROPERTY("HiddenPhotosDisplayMode", CreateHiddenPhotosDisplayModeEnum(env)), + DECLARE_NAPI_PROPERTY("AnalysisType", CreateAnalysisTypeEnum(env)) }; MediaLibraryNapiUtils::NapiAddStaticProps(env, exports, staticProps); return exports; @@ -4910,6 +4911,8 @@ static void JSGetPhotoAlbumsExecute(napi_env env, void *data) if (context->hiddenOnly) { queryUri = (context->resultNapiType == ResultNapiType::TYPE_USERFILE_MGR) ? UFM_QUERY_HIDDEN_ALBUM : PAH_QUERY_HIDDEN_ALBUM; + } else if (context->isAnalysisAlbum) { + queryUri = PAH_QUERY_ANA_PHOTO_ALBUM; } else { queryUri = (context->resultNapiType == ResultNapiType::TYPE_USERFILE_MGR) ? UFM_QUERY_PHOTO_ALBUM : PAH_QUERY_PHOTO_ALBUM; @@ -5102,6 +5105,7 @@ napi_value MediaLibraryNapi::CreateAlbumTypeEnum(napi_env env) CHECK_ARGS(env, AddIntegerNamedProperty(env, result, "USER", PhotoAlbumType::USER), JS_INNER_FAIL); CHECK_ARGS(env, AddIntegerNamedProperty(env, result, "SYSTEM", PhotoAlbumType::SYSTEM), JS_INNER_FAIL); + CHECK_ARGS(env, AddIntegerNamedProperty(env, result, "SMART", PhotoAlbumType::SMART), JS_INNER_FAIL); CHECK_ARGS(env, napi_create_reference(env, result, NAPI_INIT_REF_COUNT, &sAlbumType_), JS_INNER_FAIL); return result; @@ -5118,11 +5122,26 @@ napi_value MediaLibraryNapi::CreateAlbumSubTypeEnum(napi_env env) CHECK_ARGS(env, AddIntegerNamedProperty(env, result, systemAlbumSubType[i], PhotoAlbumSubType::SYSTEM_START + i), JS_INNER_FAIL); } + for (size_t i = 0; i < analysisAlbumSubType.size(); i++) { + CHECK_ARGS(env, AddIntegerNamedProperty(env, result, analysisAlbumSubType[i], + PhotoAlbumSubType::ANALYSIS_START + i), JS_INNER_FAIL); + } CHECK_ARGS(env, AddIntegerNamedProperty(env, result, "ANY", PhotoAlbumSubType::ANY), JS_INNER_FAIL); CHECK_ARGS(env, napi_create_reference(env, result, NAPI_INIT_REF_COUNT, &sAlbumSubType_), JS_INNER_FAIL); return result; } + +napi_value MediaLibraryNapi::CreateAnalysisTypeEnum(napi_env env, napi_callback_info info) +{ + napi_value result = nullptr; + CHECK_ARGS(env, AddIntegerNamedProperty(env, result, "ANALYSIS_AETSTHETICS_SCORE", + AnalysisType::ANALYSIS_AETSTHETICS_SCORE), JS_INNER_FAIL); + CHECK_ARGS(env, AddIntegerNamedProperty(env, result, "ANALYSIS_LABEL", AnalysisType::ANALYSIS_LABEL), JS_INNER_FAIL); + CHECK_ARGS(env, AddIntegerNamedProperty(env, result, "ANALYSIS_OCR", AnalysisType::ANALYSIS_OCR), JS_INNER_FAIL); + return result; +} + napi_value MediaLibraryNapi::CreateDefaultChangeUriEnum(napi_env env) { return CreateStringEnumProperty(env, DEFAULT_URI_ENUM_PROPERTIES, sDefaultChangeUriRef_); @@ -5453,6 +5472,7 @@ static napi_value ParseAlbumTypes(napi_env env, unique_ptrisAnalysisAlbum = (albumType == PhotoAlbumType::SMART) ? 1 : 0; context->predicates.And()->EqualTo(PhotoAlbumColumns::ALBUM_TYPE, to_string(albumType)); /* Parse the second argument to photo album subType */ diff --git a/frameworks/js/src/medialibrary_napi_utils.cpp b/frameworks/js/src/medialibrary_napi_utils.cpp index c60d0aed41..aca99b05a4 100644 --- a/frameworks/js/src/medialibrary_napi_utils.cpp +++ b/frameworks/js/src/medialibrary_napi_utils.cpp @@ -16,6 +16,7 @@ #include "medialibrary_napi_utils.h" +#include "basic/result_set.h" #include "datashare_predicates_proxy.h" #include "ipc_skeleton.h" #include "media_asset_change_request_napi.h" @@ -32,12 +33,14 @@ #include "photo_map_column.h" #include "smart_album_napi.h" #include "tokenid_kit.h" +#include "vision_column.h" using namespace std; using namespace OHOS::DataShare; namespace OHOS { namespace Media { +using json = nlohmann::json; napi_value MediaLibraryNapiUtils::NapiDefineClass(napi_env env, napi_value exports, const NapiClassInfo &info) { napi_value ctorObj; @@ -790,6 +793,17 @@ int32_t MediaLibraryNapiUtils::GetUserAlbumPredicates( return E_SUCCESS; } +int32_t MediaLibraryNapiUtils::GetAnalysisAlbumPredicates(const int32_t albumId, DataSharePredicates &predicates) +{ + string onClause = MediaColumn::MEDIA_ID + " = " + PhotoMap::ASSET_ID; + predicates.InnerJoin(ANALYSIS_PHOTO_MAP_TABLE)->On({ onClause }); + predicates.EqualTo(PhotoMap::ALBUM_ID, to_string(albumId)); + predicates.EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0)); + predicates.EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(0)); + predicates.EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0)); + return E_SUCCESS; +} + static int32_t GetFavoritePredicates(DataSharePredicates &predicates, const bool hiddenOnly) { predicates.BeginWrap(); @@ -896,6 +910,55 @@ int32_t MediaLibraryNapiUtils::GetSystemAlbumPredicates(const PhotoAlbumSubType } } +string MediaLibraryNapiUtils::ParseResultSet2JsonStr(shared_ptr resultSet, + const std::vector &cloumns) +{ + json jsonObject; + if (resultSet->GoToFirstRow() != NativeRdb::E_OK) { + NAPI_ERR_LOG("ParseResultSet2JsonStr resultSet is empty"); + return jsonObject.dump(); + } + for (int i = 0; i < cloumns.size(); i++) { + DataShare::DataType dataType; + resultSet->GetDataType(i, dataType); + switch (dataType) { + case DataShare::DataType::TYPE_INTEGER: { + int intValue = -1; + if (resultSet->GetInt(i, intValue) == NativeRdb::E_OK) { + jsonObject[cloumns[i]] = to_string(intValue); + } + break; + } + case DataShare::DataType::TYPE_FLOAT: { + double douValue = 0.0; + if (resultSet->GetDouble(i, douValue) == NativeRdb::E_OK) { + jsonObject[cloumns[i]] = to_string(douValue); + } + break; + } + case DataShare::DataType::TYPE_STRING: { + std::string strValue; + if (resultSet->GetString(i, strValue) == NativeRdb::E_OK) { + jsonObject[cloumns[i]] = strValue; + } + break; + } + case DataShare::DataType::TYPE_BLOB: { + std::vector blobValue; + if (resultSet->GetBlob(i, blobValue) == NativeRdb::E_OK) { + std::string tempValue(blobValue.begin(), blobValue.end()); + jsonObject[cloumns[i]] = tempValue; + } + break; + } + default: { + NAPI_ERR_LOG("Unsupported dateType: %{public}d", dataType); + } + } + } + return jsonObject.dump(); +} + string MediaLibraryNapiUtils::GetStringFetchProperty(napi_env env, napi_value arg, bool &err, bool &present, const string &propertyName) { diff --git a/frameworks/js/src/photo_album_napi.cpp b/frameworks/js/src/photo_album_napi.cpp index 8bc8dc3610..c44745b113 100644 --- a/frameworks/js/src/photo_album_napi.cpp +++ b/frameworks/js/src/photo_album_napi.cpp @@ -785,6 +785,11 @@ static int32_t GetPredicatesByAlbumTypes(const shared_ptr &photoAlbu return MediaLibraryNapiUtils::GetUserAlbumPredicates(photoAlbum->GetAlbumId(), predicates, hiddenOnly); } + if (type == PhotoAlbumType::SMART) + { + return MediaLibraryNapiUtils::GetAnalysisAlbumPredicates(photoAlbum->GetAlbumId(), predicates); + } + if ((type != PhotoAlbumType::SYSTEM) || (subType == PhotoAlbumSubType::USER_GENERIC) || (subType == PhotoAlbumSubType::ANY)) { return E_INVALID_ARGUMENTS; diff --git a/frameworks/js/src/photoaccesshelperinf.js b/frameworks/js/src/photoaccesshelperinf.js index 0a6bb131da..bc06650953 100644 --- a/frameworks/js/src/photoaccesshelperinf.js +++ b/frameworks/js/src/photoaccesshelperinf.js @@ -381,6 +381,7 @@ export default { NotifyType: photoAccessHelper.NotifyType, DefaultChangeUri: photoAccessHelper.DefaultChangeUri, HiddenPhotosDisplayMode: photoAccessHelper.HiddenPhotosDisplayMode, + AnalysisType: photoAccessHelper.AnalysisType, PhotoViewMIMETypes: PhotoViewMIMETypes, PhotoSelectOptions: PhotoSelectOptions, PhotoSelectResult: PhotoSelectResult, diff --git a/frameworks/utils/include/userfile_manager_types.h b/frameworks/utils/include/userfile_manager_types.h index 1afc2a6e74..e821c3fa25 100644 --- a/frameworks/utils/include/userfile_manager_types.h +++ b/frameworks/utils/include/userfile_manager_types.h @@ -47,9 +47,17 @@ enum MediaType { MEDIA_TYPE_DEFAULT, }; +enum AnalysisType { + ANALYSIS_INVALID = -1, + ANALYSIS_AETSTHETICS_SCORE, + ANALYSIS_LABEL, + ANALYSIS_OCR, +}; + enum PhotoAlbumType : int32_t { USER = 0, - SYSTEM = 1024 + SYSTEM = 1024, + SMART = 10000 }; enum PhotoAlbumSubType : int32_t { @@ -64,6 +72,10 @@ enum PhotoAlbumSubType : int32_t { CAMERA, IMAGES, SYSTEM_END = IMAGES, + ANALYSIS_START = 10001, + CLASSIFY_CATEGORY = ANALYSIS_START, + CLASSIFY_SUBCATEGORY = 10002, + ANALYSIS_END = 10100, ANY = std::numeric_limits::max() }; diff --git a/frameworks/utils/include/userfilemgr_uri.h b/frameworks/utils/include/userfilemgr_uri.h index f79617e31e..12999860df 100644 --- a/frameworks/utils/include/userfilemgr_uri.h +++ b/frameworks/utils/include/userfilemgr_uri.h @@ -173,6 +173,10 @@ const std::string UFM_DELETE_PHOTOS = MEDIALIBRARY_DATA_URI + "/" + UFM_ALBUM + const std::string PAH_PHOTO = "phaccess_photo_operation"; const std::string PAH_ALBUM = "phaccess_album_operation"; const std::string PAH_MAP = "phaccess_map_operation"; +const std::string PAH_ANA_ALBUM = "phaccess_ana_album_operation"; +const std::string PAH_ANA_MAP = "phaccess_ana_map_operation"; +const std::string PAH_ANA_OCR = "phaccess_ana_ocr_operation"; +const std::string PAH_ANA_ATTS = "phaccess_ana_atts_operation"; // UserFileManager photo operation constants const std::string PAH_CREATE_PHOTO = MEDIALIBRARY_DATA_URI + "/" + PAH_PHOTO + "/" + OPRN_CREATE; @@ -201,6 +205,15 @@ const std::string PAH_ORDER_ALBUM = MEDIALIBRARY_DATA_URI + "/" + PAH_ALBUM + "/ const std::string PAH_COMMIT_EDIT_PHOTOS = MEDIALIBRARY_DATA_URI + "/" + PAH_PHOTO + "/" + OPRN_COMMIT_EDIT; const std::string PAH_REVERT_EDIT_PHOTOS = MEDIALIBRARY_DATA_URI + "/" + PAH_PHOTO + "/" + OPRN_REVERT_EDIT; +const std::string PAH_QUERY_ANA_PHOTO_ALBUM = MEDIALIBRARY_DATA_URI + "/" + PAH_ANA_ALBUM + "/" + OPRN_QUERY; +const std::string PAH_QUERY_ANA_PHOTO_MAP = MEDIALIBRARY_DATA_URI + "/" + PAH_ANA_MAP + "/" + OPRN_QUERY; +const std::string PAH_INSERT_ANA_PHOTO_ALBUM = MEDIALIBRARY_DATA_URI + "/" + PAH_ANA_ALBUM + "/" + OPRN_CREATE; +const std::string PAH_UPDATE_ANA_PHOTO_ALBUM = MEDIALIBRARY_DATA_URI + "/" + PAH_ANA_ALBUM + "/" + OPRN_UPDATE; +const std::string PAH_INSERT_ANA_PHOTO_MAP = MEDIALIBRARY_DATA_URI + "/" + PAH_ANA_MAP + "/" + OPRN_CREATE; + +const std::string PAH_QUERY_ANA_OCR = MEDIALIBRARY_DATA_URI + "/" + PAH_ANA_OCR + "/" + OPRN_QUERY; +const std::string PAH_QUERY_ANA_ATTS = MEDIALIBRARY_DATA_URI + "/" + PAH_ANA_ATTS + "/" + OPRN_QUERY; + // mediatool operation constants const std::string TOOL_PHOTO = "mediatool_photo_operation"; const std::string TOOL_AUDIO = "mediatool_audio_operation"; diff --git a/interfaces/inner_api/media_library_helper/include/medialibrary_db_const.h b/interfaces/inner_api/media_library_helper/include/medialibrary_db_const.h index c9e8b18f5e..4f21f207ed 100644 --- a/interfaces/inner_api/media_library_helper/include/medialibrary_db_const.h +++ b/interfaces/inner_api/media_library_helper/include/medialibrary_db_const.h @@ -22,7 +22,7 @@ namespace OHOS { namespace Media { -const int32_t MEDIA_RDB_VERSION = 30; +const int32_t MEDIA_RDB_VERSION = 31; enum { VERSION_ADD_CLOUD = 2, VERSION_ADD_META_MODIFED = 3, @@ -57,6 +57,7 @@ enum { VERSION_ADD_LAST_VISIT_TIME = 28, VERSION_ADD_LOCATION_TABLE = 29, VERSION_ADD_ALBUM_ORDER = 30, + VERSION_ADD_VISION_ALBUM = 31, }; enum { diff --git a/interfaces/inner_api/media_library_helper/include/photo_album_column.h b/interfaces/inner_api/media_library_helper/include/photo_album_column.h index eed0a248b8..2b29e281fe 100644 --- a/interfaces/inner_api/media_library_helper/include/photo_album_column.h +++ b/interfaces/inner_api/media_library_helper/include/photo_album_column.h @@ -77,6 +77,8 @@ public: const bool hiddenState); static void GetSystemAlbumPredicates(const PhotoAlbumSubType subType, NativeRdb::RdbPredicates &predicates, const bool hiddenState); + static void GetAnalysisAlbumPredicates(const int32_t albumId, NativeRdb::RdbPredicates &predicates, + const bool hiddenState); }; } // namespace OHOS::Media #endif // INTERFACES_INNERKITS_NATIVE_INCLUDE_PHOTO_ALBUM_COLUMN_H diff --git a/interfaces/inner_api/media_library_helper/include/vision_column.h b/interfaces/inner_api/media_library_helper/include/vision_column.h index 76547997c8..b367c8cf70 100644 --- a/interfaces/inner_api/media_library_helper/include/vision_column.h +++ b/interfaces/inner_api/media_library_helper/include/vision_column.h @@ -29,6 +29,8 @@ const std::string VISION_TOTAL_TABLE = "tab_analysis_total"; const std::string VISION_SHIELD_TABLE = "tab_application_shield"; const std::string VISION_IMAGE_FACE_TABLE = "tab_analysis_image_face"; const std::string VISION_FACE_TAG_TABLE = "tab_analysis_face_tag"; +const std::string ANALYSIS_ALBUM_TABLE = "AnalysisAlbum"; +const std::string ANALYSIS_PHOTO_MAP_TABLE = "AnalysisPhotoMap"; // create vision table const std::string ID = "id"; @@ -36,12 +38,17 @@ const std::string FILE_ID = "file_id"; const std::string OCR_TEXT = "ocr_text"; const std::string OCR_VERSION = "ocr_version"; const std::string OCR_TEXT_MSG = "ocr_text_msg"; +const std::string OCR_WIDTH = "width"; +const std::string OCR_HEIGHT = "height"; +const std::string OCR_PRE_MSG = "ocr_pre_msg"; const std::string CREATE_TAB_ANALYSIS_OCR = "CREATE TABLE IF NOT EXISTS " + VISION_OCR_TABLE + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + FILE_ID + " INT UNIQUE, " + OCR_TEXT + " TEXT, " + OCR_VERSION + " TEXT, " + - OCR_TEXT_MSG + " TEXT) "; + OCR_TEXT_MSG + " TEXT, " + + OCR_WIDTH + " INT, " + + OCR_HEIGHT + " INT)"; const std::string CATEGORY_ID = "category_id"; const std::string SUB_LABEL = "sub_label"; @@ -161,6 +168,30 @@ const std::string CREATE_TAB_FACE_TAG = "CREATE TABLE IF NOT EXISTS " + VISION_F ALBUM_TYPE + " INTEGER, " + IS_REMOVED + " INTEGER) "; + +const std::string ALBUM_ID = "album_id"; + +const std::string ALBUM_SUBTYPE = "album_subtype"; +const std::string ALBUM_NAME = "album_name"; +const std::string DATE_MODIFIED = "date_modified"; +const std::string RANK = "rank"; +const std::string CREATE_ANALYSIS_ALBUM = "CREATE TABLE IF NOT EXISTS " + ANALYSIS_ALBUM_TABLE + " (" + + ALBUM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + + ALBUM_TYPE + " INT, " + + ALBUM_SUBTYPE + " INT, " + + ALBUM_NAME + " TEXT, " + + COVER_URI + " TEXT, " + + COUNT + " INT, " + + DATE_MODIFIED + " BIGINT, " + + RANK + " INT) "; + +const std::string MAP_ALBUM = "map_album"; +const std::string MAP_ASSET = "map_asset"; +const std::string CREATE_ANALYSIS_ALBUM_MAP = "CREATE TABLE IF NOT EXISTS " + ANALYSIS_PHOTO_MAP_TABLE + " (" + + MAP_ALBUM + " INT, " + + MAP_ASSET + " INT, " + + "PRIMARY KEY (" + MAP_ALBUM + "," + MAP_ASSET + ")) "; + const std::string INIT_TAB_ANALYSIS_TOTAL = "INSERT INTO " + VISION_TOTAL_TABLE + " (" + FILE_ID + ", " + STATUS + ", " + OCR + ", " + AESTHETICS_SCORE + ", " + LABEL + ") " + "SELECT " + FILE_ID + diff --git a/interfaces/kits/js/BUILD.gn b/interfaces/kits/js/BUILD.gn index eed51b5bdd..ae95064d2b 100644 --- a/interfaces/kits/js/BUILD.gn +++ b/interfaces/kits/js/BUILD.gn @@ -326,6 +326,7 @@ ohos_shared_library("photoaccesshelper") { "ability_runtime:abilitykit_native", "ability_runtime:napi_base_context", "c_utils:utils", + "data_share:datashare_common", "data_share:datashare_consumer", "hilog:libhilog", "napi:ace_napi", diff --git a/interfaces/kits/js/include/file_asset_napi.h b/interfaces/kits/js/include/file_asset_napi.h index 76afe8dfc6..4af4cd2f28 100644 --- a/interfaces/kits/js/include/file_asset_napi.h +++ b/interfaces/kits/js/include/file_asset_napi.h @@ -123,6 +123,7 @@ private: static napi_value UserFileMgrSetPending(napi_env env, napi_callback_info info); static napi_value JSGetExif(napi_env env, napi_callback_info info); static napi_value UserFileMgrSetUserComment(napi_env env, napi_callback_info info); + static napi_value PhotoAccessHelperGetAnalysisData(napi_env env, napi_callback_info info); static napi_value PhotoAccessHelperOpen(napi_env env, napi_callback_info info); static napi_value PhotoAccessHelperClose(napi_env env, napi_callback_info info); @@ -164,12 +165,14 @@ struct FileAssetAsyncContext : public NapiError { bool isDirectory; int32_t changedRows; int32_t fd; + int32_t analysisType = AnalysisType::ANALYSIS_INVALID; bool isFavorite = false; bool isTrash = false; bool isHidden = false; bool isPending = false; bool hasEdit = false; std::string networkId; + std::string analysisData; std::shared_ptr pixelmap; size_t argc; diff --git a/interfaces/kits/js/include/media_library_napi.h b/interfaces/kits/js/include/media_library_napi.h index f229c71f0e..2af420097b 100644 --- a/interfaces/kits/js/include/media_library_napi.h +++ b/interfaces/kits/js/include/media_library_napi.h @@ -330,6 +330,7 @@ struct MediaLibraryAsyncContext : public NapiError { int32_t imagePreviewIndex; int32_t parentSmartAlbumId = 0; int32_t smartAlbumId = -1; + int32_t isAnalysisAlbum = 0; size_t argc; napi_value argv[NAPI_ARGC_MAX]; ResultNapiType resultNapiType; diff --git a/interfaces/kits/js/include/medialibrary_napi_utils.h b/interfaces/kits/js/include/medialibrary_napi_utils.h index c34cf24f48..acefbdceff 100644 --- a/interfaces/kits/js/include/medialibrary_napi_utils.h +++ b/interfaces/kits/js/include/medialibrary_napi_utils.h @@ -265,6 +265,10 @@ const std::vector systemAlbumSubType { "FAVORITE", "VIDEO", "HIDDEN", "TRASH", "SCREENSHOT", "CAMERA", "IMAGES" }; +const std::vector analysisAlbumSubType { + "CLASSIFY_CATEGORY", "CLASSIFY_SUBCATEGORY" +}; + const std::vector positionTypeEnum { "LOCAL", "CLOUD", "BOTH" }; @@ -520,9 +524,12 @@ public: DataShare::DataSharePredicates &predicates, const bool hiddenOnly); static int32_t GetUserAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates, const bool hiddenOnly); + static int32_t GetAnalysisAlbumPredicates(const int32_t albumId, DataShare::DataSharePredicates &predicates); static bool IsSystemApp(); static std::string GetStringFetchProperty(napi_env env, napi_value arg, bool &err, bool &present, const std::string &propertyName); + static std::string ParseResultSet2JsonStr(std::shared_ptr resultSet, + const std::vector &cloumns); static napi_value GetNapiValueArray(napi_env env, napi_value arg, std::vector &values); static napi_value GetUriArrayFromAssets( -- Gitee