1 /*
2 * Copyright (c) 2025 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 #define MLOG_TAG "MediaAlbumsService"
17
18 #include "media_albums_service.h"
19
20 #include <string>
21
22 #include "medialibrary_album_operations.h"
23 #include "media_albums_rdb_operations.h"
24 #include "media_log.h"
25 #include "medialibrary_data_manager.h"
26 #include "medialibrary_errno.h"
27 #include "medialibrary_notify.h"
28 #include "medialibrary_rdbstore.h"
29 #include "location_column.h"
30 #include "photo_album_column.h"
31 #include "story_album_column.h"
32 #include "media_file_utils.h"
33 #include "result_set_utils.h"
34 #include "medialibrary_analysis_album_operations.h"
35 #include "photo_map_operations.h"
36 #include "medialibrary_common_utils.h"
37 #include "medialibrary_business_code.h"
38 #include "vision_photo_map_column.h"
39 #include "medialibrary_client_errno.h"
40 #include "rdb_utils.h"
41 #include "medialibrary_rdb_utils.h"
42 #include "photo_map_column.h"
43 #include "permission_utils.h"
44 #include "album_operation_uri.h"
45 #include "datashare_result_set.h"
46 #include "user_photography_info_column.h"
47 #include "story_album_column.h"
48 #include "userfile_manager_types.h"
49 #include "story_cover_info_column.h"
50 #include "story_play_info_column.h"
51 #include "vision_column_comm.h"
52 #include "medialibrary_photo_operations.h"
53 #include "rdb_predicates.h"
54 #include "dfx_refresh_manager.h"
55 #include "media_file_utils.h"
56 #include "refresh_business_name.h"
57
58 using namespace std;
59 using namespace OHOS::RdbDataShareAdapter;
60
61 namespace OHOS::Media {
62
63 struct HighlightAlbumInfo {
64 std::string uriStr;
65 std::vector<std::string> fetchColumn;
66 };
67
68 static const std::map<int32_t, struct HighlightAlbumInfo> HIGHLIGHT_ALBUM_INFO_MAP = {
69 { COVER_INFO, { PAH_QUERY_HIGHLIGHT_COVER, { ID, HIGHLIGHT_ALBUM_TABLE + "." + PhotoAlbumColumns::ALBUM_ID,
70 AI_ALBUM_ID, SUB_TITLE, CLUSTER_TYPE, CLUSTER_SUB_TYPE,
71 CLUSTER_CONDITION, MIN_DATE_ADDED, MAX_DATE_ADDED, GENERATE_TIME, HIGHLIGHT_VERSION,
72 REMARKS, HIGHLIGHT_STATUS, RATIO, BACKGROUND, FOREGROUND, WORDART, IS_COVERED, COLOR,
73 RADIUS, SATURATION, BRIGHTNESS, BACKGROUND_COLOR_TYPE, SHADOW_LEVEL, TITLE_SCALE_X,
74 TITLE_SCALE_Y, TITLE_RECT_WIDTH, TITLE_RECT_HEIGHT, BACKGROUND_SCALE_X, BACKGROUND_SCALE_Y,
75 BACKGROUND_RECT_WIDTH, BACKGROUND_RECT_HEIGHT, LAYOUT_INDEX, COVER_ALGO_VERSION, COVER_KEY, COVER_STATUS,
76 HIGHLIGHT_IS_MUTED, HIGHLIGHT_IS_FAVORITE, HIGHLIGHT_THEME, HIGHLIGHT_PIN_TIME, HIGHLIGHT_USE_SUBTITLE } } },
77 { PLAY_INFO, { PAH_QUERY_HIGHLIGHT_PLAY, { ID, HIGHLIGHT_ALBUM_TABLE + "." + PhotoAlbumColumns::ALBUM_ID,
78 MUSIC, FILTER, HIGHLIGHT_PLAY_INFO, IS_CHOSEN, PLAY_INFO_VERSION, PLAY_INFO_ID } } },
79 };
80
GetInstance()81 MediaAlbumsService &MediaAlbumsService::GetInstance()
82 {
83 static MediaAlbumsService service;
84 return service;
85 }
86
DeleteHighlightAlbums(const vector<string> & albumIds)87 int32_t MediaAlbumsService::DeleteHighlightAlbums(const vector<string>& albumIds)
88 {
89 // Only Highlight albums can be deleted by this way
90 MEDIA_INFO_LOG("Delete highlight albums");
91 int32_t changedRows = this->rdbOperation_.DeleteHighlightAlbums(albumIds);
92 CHECK_AND_RETURN_RET_LOG(changedRows >= 0, E_HAS_DB_ERROR,
93 "Delete highlight album failed, changedRows is %{private}d", changedRows);
94
95 auto watch = MediaLibraryNotify::GetInstance();
96 CHECK_AND_RETURN_RET_LOG(watch != nullptr, E_ERR, "Can not get MediaLibraryNotify Instance");
97
98 if (changedRows > 0) {
99 for (size_t i = 0; i < albumIds.size(); ++i) {
100 watch->Notify(MediaFileUtils::GetUriByExtrConditions(PhotoAlbumColumns::ANALYSIS_ALBUM_URI_PREFIX,
101 albumIds[i]), NotifyType::NOTIFY_REMOVE);
102 }
103 }
104 return changedRows;
105 }
106
DeletePhotoAlbums(const std::vector<std::string> & albumIds)107 int32_t MediaAlbumsService::DeletePhotoAlbums(const std::vector<std::string> &albumIds)
108 {
109 NativeRdb::RdbPredicates rdbPredicate(PhotoAlbumColumns::TABLE);
110 rdbPredicate.In(PhotoAlbumColumns::ALBUM_ID, albumIds);
111 return MediaLibraryAlbumOperations::DeletePhotoAlbum(rdbPredicate);
112 }
113
CreatePhotoAlbum(const std::string & albumName)114 int32_t MediaAlbumsService::CreatePhotoAlbum(const std::string& albumName)
115 {
116 NativeRdb::ValuesBucket value;
117 value.PutString(PhotoAlbumColumns::ALBUM_NAME, albumName);
118 MediaLibraryCommand cmd(OperationObject::PHOTO_ALBUM, OperationType::CREATE, value);
119 return MediaLibraryAlbumOperations::HandlePhotoAlbumOperations(cmd);
120 }
121
SetSubtitle(const string & highlightAlbumId,const string & albumSubtitle)122 int32_t MediaAlbumsService::SetSubtitle(const string& highlightAlbumId, const string& albumSubtitle)
123 {
124 NativeRdb::ValuesBucket values;
125 DataShare::DataSharePredicates predicates;
126 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, highlightAlbumId);
127 values.Put(SUB_TITLE, albumSubtitle);
128 return MediaLibraryAlbumOperations::SetHighlightSubtitle(values, predicates);
129 }
130
SetHighlightUserActionData(const SetHighlightUserActionDataDto & dto)131 int32_t MediaAlbumsService::SetHighlightUserActionData(const SetHighlightUserActionDataDto& dto)
132 {
133 int32_t err = this->rdbOperation_.SetHighlightUserActionData(dto);
134 return err;
135 }
136
SetPortraitAlbumName(const ChangeRequestSetAlbumNameDto & dto)137 int32_t MediaAlbumsService::SetPortraitAlbumName(const ChangeRequestSetAlbumNameDto& dto)
138 {
139 NativeRdb::ValuesBucket values;
140 DataShare::DataSharePredicates predicates;
141 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
142 values.Put(PhotoAlbumColumns::ALBUM_NAME, dto.albumName);
143 return MediaLibraryAlbumOperations::SetAlbumName(values, predicates);
144 }
145
SetGroupAlbumName(const ChangeRequestSetAlbumNameDto & dto)146 int32_t MediaAlbumsService::SetGroupAlbumName(const ChangeRequestSetAlbumNameDto& dto)
147 {
148 NativeRdb::ValuesBucket values;
149 DataShare::DataSharePredicates predicates;
150 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
151 values.Put(PhotoAlbumColumns::ALBUM_NAME, dto.albumName);
152 return MediaLibraryAnalysisAlbumOperations::SetGroupAlbumName(values, predicates);
153 }
154
SetHighlightAlbumName(const ChangeRequestSetAlbumNameDto & dto)155 int32_t MediaAlbumsService::SetHighlightAlbumName(const ChangeRequestSetAlbumNameDto& dto)
156 {
157 NativeRdb::ValuesBucket values;
158 DataShare::DataSharePredicates predicates;
159 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
160 values.Put(PhotoAlbumColumns::ALBUM_NAME, dto.albumName);
161 return MediaLibraryAlbumOperations::SetHighlightAlbumName(values, predicates);
162 }
163
RenameUserAlbum(const string & albumId,const string & newAlbumName)164 int32_t MediaAlbumsService::RenameUserAlbum(const string& albumId, const string &newAlbumName)
165 {
166 NativeRdb::ValuesBucket values;
167 DataShare::DataSharePredicates predicates;
168 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, albumId);
169 values.Put(PhotoAlbumColumns::ALBUM_NAME, newAlbumName);
170 return MediaLibraryAlbumOperations::HandleSetAlbumNameRequest(values, predicates);
171 }
172
ChangeRequestSetAlbumName(const ChangeRequestSetAlbumNameDto & dto)173 int32_t MediaAlbumsService::ChangeRequestSetAlbumName(const ChangeRequestSetAlbumNameDto& dto)
174 {
175 switch (dto.albumSubtype) {
176 case PhotoAlbumSubType::PORTRAIT:
177 return SetPortraitAlbumName(dto);
178 case PhotoAlbumSubType::GROUP_PHOTO:
179 return SetGroupAlbumName(dto);
180 case PhotoAlbumSubType::HIGHLIGHT:
181 case PhotoAlbumSubType::HIGHLIGHT_SUGGESTIONS:
182 return SetHighlightAlbumName(dto);
183 default:
184 break;
185 }
186 return RenameUserAlbum(dto.albumId, dto.albumName);
187 }
188
SetPortraitCoverUri(const ChangeRequestSetCoverUriDto & dto)189 int32_t MediaAlbumsService::SetPortraitCoverUri(const ChangeRequestSetCoverUriDto& dto)
190 {
191 NativeRdb::ValuesBucket values;
192 DataShare::DataSharePredicates predicates;
193 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
194 values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, dto.coverUri);
195 return MediaLibraryAlbumOperations::SetCoverUri(values, predicates);
196 }
197
SetGroupAlbumCoverUri(const ChangeRequestSetCoverUriDto & dto)198 int32_t MediaAlbumsService::SetGroupAlbumCoverUri(const ChangeRequestSetCoverUriDto& dto)
199 {
200 NativeRdb::ValuesBucket values;
201 DataShare::DataSharePredicates predicates;
202 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
203 values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, dto.coverUri);
204 return MediaLibraryAnalysisAlbumOperations::SetGroupCoverUri(values, predicates);
205 }
206
SetHighlightAlbumCoverUri(const ChangeRequestSetCoverUriDto & dto)207 int32_t MediaAlbumsService::SetHighlightAlbumCoverUri(const ChangeRequestSetCoverUriDto& dto)
208 {
209 NativeRdb::ValuesBucket values;
210 DataShare::DataSharePredicates predicates;
211 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
212 values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, dto.coverUri);
213 return MediaLibraryAlbumOperations::SetHighlightCoverUri(values, predicates);
214 }
215
SetUserAlbumCoverUri(const ChangeRequestSetCoverUriDto & dto)216 int32_t MediaAlbumsService::SetUserAlbumCoverUri(const ChangeRequestSetCoverUriDto& dto)
217 {
218 NativeRdb::ValuesBucket values;
219 DataShare::DataSharePredicates predicates;
220 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
221 values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, dto.coverUri);
222 values.Put(PhotoAlbumColumns::ALBUM_SUBTYPE, dto.albumSubtype);
223 return MediaLibraryAlbumOperations::UpdateAlbumCoverUri(values, predicates, false);
224 }
225
SetSourceAlbumCoverUri(const ChangeRequestSetCoverUriDto & dto)226 int32_t MediaAlbumsService::SetSourceAlbumCoverUri(const ChangeRequestSetCoverUriDto& dto)
227 {
228 NativeRdb::ValuesBucket values;
229 DataShare::DataSharePredicates predicates;
230 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
231 values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, dto.coverUri);
232 values.Put(PhotoAlbumColumns::ALBUM_SUBTYPE, dto.albumSubtype);
233 return MediaLibraryAlbumOperations::UpdateAlbumCoverUri(values, predicates, false);
234 }
235
SetSystemAlbumCoverUri(const ChangeRequestSetCoverUriDto & dto)236 int32_t MediaAlbumsService::SetSystemAlbumCoverUri(const ChangeRequestSetCoverUriDto& dto)
237 {
238 NativeRdb::ValuesBucket values;
239 DataShare::DataSharePredicates predicates;
240 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, dto.albumId);
241 values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, dto.coverUri);
242 values.Put(PhotoAlbumColumns::ALBUM_SUBTYPE, dto.albumSubtype);
243 return MediaLibraryAlbumOperations::UpdateAlbumCoverUri(values, predicates, true);
244 }
245
ChangeRequestSetCoverUri(const ChangeRequestSetCoverUriDto & dto)246 int32_t MediaAlbumsService::ChangeRequestSetCoverUri(const ChangeRequestSetCoverUriDto& dto)
247 {
248 switch (dto.albumSubtype) {
249 case PhotoAlbumSubType::PORTRAIT:
250 return SetPortraitCoverUri(dto);
251 case PhotoAlbumSubType::GROUP_PHOTO:
252 return SetGroupAlbumCoverUri(dto);
253 case PhotoAlbumSubType::HIGHLIGHT:
254 case PhotoAlbumSubType::HIGHLIGHT_SUGGESTIONS:
255 return SetHighlightAlbumCoverUri(dto);
256 default:
257 break;
258 }
259 return SetUserAlbumCoverUri(dto);
260 }
261
ChangeRequestSetDisplayLevel(int32_t displayLevelValue,int32_t albumId)262 int32_t MediaAlbumsService::ChangeRequestSetDisplayLevel(int32_t displayLevelValue,
263 int32_t albumId)
264 {
265 NativeRdb::ValuesBucket values;
266 DataShare::DataSharePredicates predicates;
267 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(albumId));
268 values.Put(USER_DISPLAY_LEVEL, displayLevelValue);
269 return MediaLibraryAlbumOperations::SetDisplayLevel(values, predicates);
270 }
271
ChangeRequestSetIsMe(int32_t albumId)272 int32_t MediaAlbumsService::ChangeRequestSetIsMe(int32_t albumId)
273 {
274 NativeRdb::ValuesBucket values;
275 DataShare::DataSharePredicates predicates;
276 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(albumId));
277 return MediaLibraryAlbumOperations::SetIsMe(values, predicates);
278 }
279
ChangeRequestDismiss(int32_t albumId)280 int32_t MediaAlbumsService::ChangeRequestDismiss(int32_t albumId)
281 {
282 NativeRdb::ValuesBucket values;
283 DataShare::DataSharePredicates predicates;
284 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(albumId));
285 return MediaLibraryAnalysisAlbumOperations::DismissGroupPhotoAlbum(values, predicates);
286 }
287
ChangeRequestResetCoverUri(int32_t albumId,PhotoAlbumSubType albumSubType)288 int32_t MediaAlbumsService::ChangeRequestResetCoverUri(int32_t albumId, PhotoAlbumSubType albumSubType)
289 {
290 NativeRdb::ValuesBucket values;
291 DataShare::DataSharePredicates predicates;
292 values.Put(PhotoAlbumColumns::ALBUM_SUBTYPE, albumSubType);
293 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(albumId));
294 return MediaLibraryAlbumOperations::ResetCoverUri(values, predicates);
295 }
296
AlbumCommitModify(const AlbumCommitModifyDto & commitModifyDto,int32_t businessCode)297 int32_t MediaAlbumsService::AlbumCommitModify(const AlbumCommitModifyDto& commitModifyDto, int32_t businessCode)
298 {
299 DataShare::DataSharePredicates predicates;
300 NativeRdb::ValuesBucket values;
301 if (businessCode == static_cast<uint32_t>(MediaLibraryBusinessCode::PAH_COMMIT_MODIFY)) {
302 values.Put(PhotoAlbumColumns::ALBUM_NAME, commitModifyDto.albumName);
303 }
304 values.Put(PhotoAlbumColumns::ALBUM_COVER_URI, commitModifyDto.coverUri);
305 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(commitModifyDto.albumId));
306
307 int32_t changedRows = MediaLibraryAlbumOperations::UpdatePhotoAlbum(values, predicates);
308 return changedRows;
309 }
310
QueryPhoto(int32_t albumId,bool isSmartAlbum)311 static shared_ptr<NativeRdb::ResultSet> QueryPhoto(int32_t albumId, bool isSmartAlbum)
312 {
313 NativeRdb::RdbPredicates querypred(PhotoAlbumColumns::TABLE);
314 querypred.EqualTo(PhotoAlbumColumns::ALBUM_ID, to_string(albumId));
315 querypred.OrderByAsc(PhotoAlbumColumns::ALBUM_ORDER);
316
317 auto whereClause = querypred.GetWhereClause();
318 CHECK_AND_RETURN_RET_LOG(MediaLibraryCommonUtils::CheckWhereClause(whereClause), nullptr,
319 "illegal query whereClause input %{private}s", whereClause.c_str());
320
321 vector<string> fetchColumn = {
322 PhotoAlbumColumns::ALBUM_ID,
323 PhotoAlbumColumns::ALBUM_COUNT,
324 };
325 if (!isSmartAlbum) {
326 fetchColumn.push_back(PhotoAlbumColumns::ALBUM_IMAGE_COUNT);
327 fetchColumn.push_back(PhotoAlbumColumns::ALBUM_VIDEO_COUNT);
328 }
329 MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(const_cast<vector<string> &>(fetchColumn));
330 return MediaLibraryRdbStore::QueryWithFilter(querypred, fetchColumn);
331 }
332
FetchNewCount(shared_ptr<NativeRdb::ResultSet> resultSet,AlbumPhotoQueryRespBody & respBody)333 static int32_t FetchNewCount(shared_ptr<NativeRdb::ResultSet> resultSet, AlbumPhotoQueryRespBody& respBody)
334 {
335 if (resultSet == nullptr) {
336 MEDIA_ERR_LOG("resultSet == nullptr");
337 return E_ERR;
338 }
339
340 if (resultSet->GoToFirstRow() != 0) {
341 MEDIA_ERR_LOG("go to first row failed");
342 return E_ERR;
343 }
344
345 respBody.newCount =
346 get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoAlbumColumns::ALBUM_COUNT, resultSet, TYPE_INT32));
347 respBody.newImageCount =
348 get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoAlbumColumns::ALBUM_IMAGE_COUNT, resultSet, TYPE_INT32));
349 respBody.newVideoCount =
350 get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoAlbumColumns::ALBUM_VIDEO_COUNT, resultSet, TYPE_INT32));
351 return E_OK;
352 }
353
AlbumAddAssets(const AlbumAddAssetsDto & addAssetsDto,AlbumPhotoQueryRespBody & respBody)354 int32_t MediaAlbumsService::AlbumAddAssets(const AlbumAddAssetsDto& addAssetsDto, AlbumPhotoQueryRespBody& respBody)
355 {
356 vector<DataShare::DataShareValuesBucket> valuesBuckets;
357 for (const auto &assetId : addAssetsDto.assetsArray) {
358 DataShare::DataShareValuesBucket valuesBucket;
359 valuesBucket.Put(PhotoColumn::PHOTO_OWNER_ALBUM_ID, addAssetsDto.albumId);
360 valuesBucket.Put(PhotoColumn::MEDIA_ID, assetId);
361 valuesBuckets.push_back(valuesBucket);
362 }
363
364 int32_t changedRows = PhotoMapOperations::AddPhotoAssets(valuesBuckets);
365 if (changedRows < 0) {
366 return changedRows;
367 }
368
369 auto resultSet = QueryPhoto(addAssetsDto.albumId, addAssetsDto.isSmartAlbum);
370 if (FetchNewCount(resultSet, respBody) != E_OK) {
371 return -1;
372 }
373 return changedRows;
374 }
375
AlbumRemoveAssets(const AlbumRemoveAssetsDto & removeAssetsDto,AlbumPhotoQueryRespBody & respBody)376 int32_t MediaAlbumsService::AlbumRemoveAssets(const AlbumRemoveAssetsDto& removeAssetsDto,
377 AlbumPhotoQueryRespBody& respBody)
378 {
379 DataShare::DataSharePredicates predicates;
380 predicates.EqualTo(PhotoColumn::PHOTO_OWNER_ALBUM_ID, to_string(removeAssetsDto.albumId));
381 predicates.And()->In(PhotoColumn::MEDIA_ID, removeAssetsDto.assetsArray);
382
383 auto whereClause = predicates.GetWhereClause();
384 CHECK_AND_RETURN_RET_LOG(MediaLibraryCommonUtils::CheckWhereClause(whereClause), E_SQL_CHECK_FAIL,
385 "illegal query whereClause input %{private}s", whereClause.c_str());
386
387 NativeRdb::RdbPredicates rdbPredicate = RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, PhotoMap::TABLE);
388 int32_t changedRows = PhotoMapOperations::RemovePhotoAssets(rdbPredicate);
389 if (changedRows < 0) {
390 return changedRows;
391 }
392
393 auto resultSet = QueryPhoto(removeAssetsDto.albumId, removeAssetsDto.isSmartAlbum);
394 if (FetchNewCount(resultSet, respBody) != E_OK) {
395 return -1;
396 }
397 return changedRows;
398 }
399
AlbumRecoverAssets(const AlbumRecoverAssetsDto & recoverAssetsDto)400 int32_t MediaAlbumsService::AlbumRecoverAssets(const AlbumRecoverAssetsDto& recoverAssetsDto)
401 {
402 DataShare::DataSharePredicates predicates;
403 predicates.In(MediaColumn::MEDIA_ID, recoverAssetsDto.uris);
404
405 return MediaLibraryAlbumOperations::RecoverPhotoAssets(predicates);
406 }
407
AlbumGetAssets(AlbumGetAssetsDto & dto)408 std::shared_ptr<DataShare::DataShareResultSet> MediaAlbumsService::AlbumGetAssets(AlbumGetAssetsDto &dto)
409 {
410 auto startTime = MediaFileUtils::UTCTimeMilliSeconds();
411 MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(dto.columns);
412 NativeRdb::RdbPredicates predicates =
413 RdbDataShareAdapter::RdbUtils::ToPredicates(dto.predicates, PhotoColumn::PHOTOS_TABLE);
414 auto resultSet = PhotoMapOperations::QueryPhotoAssets(predicates, dto.columns);
415 auto totalCostTime = MediaFileUtils::UTCTimeMilliSeconds() - startTime;
416 AccurateRefresh::DfxRefreshManager::QueryStatementReport(
417 AccurateRefresh::GET_ASSETS_BUSSINESS_NAME, totalCostTime, predicates.GetStatement());
418 CHECK_AND_RETURN_RET_LOG(resultSet, nullptr, "Failed to query album assets");
419 auto resultSetBridge = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(resultSet);
420 return make_shared<DataShare::DataShareResultSet>(resultSetBridge);
421 }
422
LogQueryParams(const DataShare::DataSharePredicates & predicates,const vector<string> & fetchColumn)423 static void LogQueryParams(const DataShare::DataSharePredicates &predicates, const vector<string> &fetchColumn)
424 {
425 std::string sqlColumns;
426 for (const auto &column : fetchColumn) {
427 if (!sqlColumns.empty()) {
428 sqlColumns += ",";
429 }
430 sqlColumns += column;
431 }
432 NativeRdb::RdbPredicates rdbPredicate = RdbUtils::ToPredicates(predicates, PhotoAlbumColumns::TABLE);
433 std::string sqlWhere = rdbPredicate.GetWhereClause();
434 for (const auto &whereArg : rdbPredicate.GetWhereArgs()) {
435 sqlWhere.replace(sqlWhere.find("?"), 1, whereArg);
436 }
437 std::string sqlOrder = rdbPredicate.GetOrder();
438 MEDIA_INFO_LOG("sqlColumns: %{public}s", sqlColumns.c_str());
439 MEDIA_INFO_LOG("sqlWhere: %{public}s", sqlWhere.c_str());
440 MEDIA_INFO_LOG("sqlOrder: %{public}s", sqlOrder.c_str());
441 }
442
CheckAlbumFetchColumns(const vector<string> & fetchColumn)443 static bool CheckAlbumFetchColumns(const vector<string> &fetchColumn)
444 {
445 for (const auto &column : fetchColumn) {
446 if (!PhotoAlbumColumns::IsPhotoAlbumColumn(column)) {
447 MEDIA_ERR_LOG("Invalid columns:%{public}s", column.c_str());
448 return false;
449 }
450 }
451 return true;
452 }
453
ReplaceFetchColumn(std::vector<std::string> & fetchColumn,const std::string & oldColumn,const std::string & newColumn)454 static void ReplaceFetchColumn(std::vector<std::string> &fetchColumn,
455 const std::string &oldColumn, const std::string &newColumn)
456 {
457 auto it = std::find(fetchColumn.begin(), fetchColumn.end(), oldColumn);
458 if (it != fetchColumn.end()) {
459 it->assign(newColumn);
460 }
461 }
462
AddDefaultPhotoAlbumColumns(vector<string> & fetchColumn)463 static void AddDefaultPhotoAlbumColumns(vector<string> &fetchColumn)
464 {
465 auto columns = PhotoAlbumColumns::DEFAULT_FETCH_COLUMNS;
466 for (const auto &column : fetchColumn) {
467 if (columns.count(column) == 0) {
468 columns.insert(column);
469 }
470 }
471 fetchColumn.assign(columns.begin(), columns.end());
472 }
473
AddNoSmartFetchColumns(std::vector<std::string> & fetchColumn)474 static void AddNoSmartFetchColumns(std::vector<std::string> &fetchColumn)
475 {
476 AddDefaultPhotoAlbumColumns(fetchColumn);
477 fetchColumn.push_back(PhotoAlbumColumns::ALBUM_IMAGE_COUNT);
478 fetchColumn.push_back(PhotoAlbumColumns::ALBUM_VIDEO_COUNT);
479 fetchColumn.push_back(PhotoAlbumColumns::ALBUM_LPATH);
480 fetchColumn.push_back(PhotoAlbumColumns::ALBUM_DATE_ADDED);
481 }
482
AddPhotoAlbumTypeFilter(DataShare::DataSharePredicates & predicates,int32_t albumType,int32_t albumSubType)483 static void AddPhotoAlbumTypeFilter(DataShare::DataSharePredicates &predicates,
484 int32_t albumType, int32_t albumSubType)
485 {
486 if (albumType != PhotoAlbumType::INVALID) {
487 predicates.And()->EqualTo(PhotoAlbumColumns::ALBUM_TYPE, to_string(albumType));
488 }
489 if (albumSubType != PhotoAlbumSubType::ANY) {
490 predicates.And()->EqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, to_string(albumSubType));
491 if (albumSubType == PhotoAlbumSubType::SHOOTING_MODE || albumSubType == PhotoAlbumSubType::GEOGRAPHY_CITY) {
492 predicates.OrderByDesc(PhotoAlbumColumns::ALBUM_COUNT);
493 }
494 }
495 if (PermissionUtils::IsSystemApp()) {
496 predicates.And()->NotEqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, to_string(PhotoAlbumSubType::HIDDEN));
497 } else {
498 predicates.And()->In(PhotoAlbumColumns::ALBUM_SUBTYPE, vector<string>({
499 to_string(PhotoAlbumSubType::USER_GENERIC),
500 to_string(PhotoAlbumSubType::FAVORITE),
501 to_string(PhotoAlbumSubType::VIDEO),
502 to_string(PhotoAlbumSubType::IMAGE),
503 }));
504 }
505 }
506
GetAllLocationPredicates(DataShare::DataSharePredicates & predicates)507 static NativeRdb::RdbPredicates GetAllLocationPredicates(DataShare::DataSharePredicates &predicates)
508 {
509 predicates.EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0));
510 predicates.EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(0));
511 predicates.EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0));
512 predicates.EqualTo(PhotoColumn::PHOTO_IS_TEMP, to_string(0));
513 predicates.EqualTo(PhotoColumn::PHOTO_BURST_COVER_LEVEL,
514 to_string(static_cast<int32_t>(BurstCoverLevelType::COVER)));
515 predicates.And()->NotEqualTo(PhotoColumn::PHOTO_LATITUDE, to_string(0));
516 predicates.And()->NotEqualTo(PhotoColumn::PHOTO_LONGITUDE, to_string(0));
517 return RdbUtils::ToPredicates(predicates, PhotoColumn::PHOTOS_TABLE);
518 }
519
ReplacePredicatesColumn(DataShare::DataSharePredicates & predicates,const std::string & oldColumn,const std::string & newColumn)520 static void ReplacePredicatesColumn(DataShare::DataSharePredicates& predicates,
521 const std::string &oldColumn, const std::string &newColumn)
522 {
523 constexpr int32_t fieldIdx = 0;
524 auto& items = predicates.GetOperationList();
525 std::vector<DataShare::OperationItem> tmpOperations = {};
526 for (const DataShare::OperationItem& item : items) {
527 if (item.singleParams.empty()) {
528 tmpOperations.push_back(item);
529 continue;
530 }
531 if (static_cast<string>(item.GetSingle(fieldIdx)) == oldColumn) {
532 DataShare::OperationItem tmpItem = item;
533 tmpItem.singleParams[fieldIdx] = newColumn;
534 tmpOperations.push_back(tmpItem);
535 continue;
536 }
537 tmpOperations.push_back(item);
538 }
539 predicates = DataShare::DataSharePredicates(move(tmpOperations));
540 }
541
AddHighlightAlbumPredicates(DataShare::DataSharePredicates & predicates,int32_t albumSubType)542 static void AddHighlightAlbumPredicates(DataShare::DataSharePredicates& predicates, int32_t albumSubType)
543 {
544 std::string analysisAlbumId = ANALYSIS_ALBUM_TABLE + "." + PhotoAlbumColumns::ALBUM_ID;
545 vector<string> onClause = {
546 analysisAlbumId + " = " + HIGHLIGHT_ALBUM_TABLE + "." + PhotoAlbumColumns::ALBUM_ID,
547 };
548 if (albumSubType == PhotoAlbumSubType::HIGHLIGHT_SUGGESTIONS) {
549 onClause = {
550 analysisAlbumId + " = " + HIGHLIGHT_ALBUM_TABLE + "." + AI_ALBUM_ID,
551 };
552 }
553 predicates.InnerJoin(HIGHLIGHT_ALBUM_TABLE)->On(onClause);
554 predicates.OrderByDesc(MAX_DATE_ADDED + ", " + GENERATE_TIME);
555 ReplacePredicatesColumn(predicates, PhotoAlbumColumns::ALBUM_ID, analysisAlbumId);
556 }
557
GenerateAnalysisCmd(MediaLibraryCommand & cmd,DataShare::DataSharePredicates & predicates)558 static void GenerateAnalysisCmd(MediaLibraryCommand &cmd,
559 DataShare::DataSharePredicates &predicates)
560 {
561 NativeRdb::RdbPredicates rdbPredicate = RdbUtils::ToPredicates(predicates, MEDIALIBRARY_TABLE);
562 cmd.GetAbsRdbPredicates()->SetWhereClause(rdbPredicate.GetWhereClause());
563 cmd.GetAbsRdbPredicates()->SetWhereArgs(rdbPredicate.GetWhereArgs());
564 cmd.GetAbsRdbPredicates()->SetOrder(rdbPredicate.GetOrder());
565 }
566
QueryAlbums(QueryAlbumsDto & dto)567 int32_t MediaAlbumsService::QueryAlbums(QueryAlbumsDto &dto)
568 {
569 std::shared_ptr<NativeRdb::ResultSet> resultSet;
570 std::vector<std::string> &columns = dto.columns;
571 MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(columns);
572 auto startTime = MediaFileUtils::UTCTimeMilliSeconds();
573 std::string sqlStr = "";
574 MediaLibraryCommand cmd(OperationObject::ANALYSIS_PHOTO_ALBUM, OperationType::QUERY);
575 if (dto.albumType == PhotoAlbumType::SMART) {
576 if (dto.albumSubType == PhotoAlbumSubType::GEOGRAPHY_LOCATION) {
577 NativeRdb::RdbPredicates rdbPredicate = GetAllLocationPredicates(dto.predicates);
578 const auto &locations = PhotoAlbumColumns::LOCATION_DEFAULT_FETCH_COLUMNS;
579 columns.insert(columns.end(), locations.begin(), locations.end());
580 resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicate, columns);
581 sqlStr = rdbPredicate.GetStatement();
582 } else if (dto.albumSubType == PhotoAlbumSubType::GEOGRAPHY_CITY) {
583 columns = PhotoAlbumColumns::CITY_DEFAULT_FETCH_COLUMNS;
584 std::string onClause = PhotoAlbumColumns::ALBUM_NAME + " = " + CITY_ID;
585 dto.predicates.InnerJoin(GEO_DICTIONARY_TABLE)->On({ onClause });
586 dto.predicates.NotEqualTo(PhotoAlbumColumns::ALBUM_COUNT, to_string(0));
587 AddPhotoAlbumTypeFilter(dto.predicates, dto.albumType, dto.albumSubType);
588 GenerateAnalysisCmd(cmd, dto.predicates);
589 resultSet = MediaLibraryDataManager::QueryAnalysisAlbum(cmd, columns, dto.predicates);
590 sqlStr = cmd.GetAbsRdbPredicates()->GetStatement();
591 } else {
592 AddDefaultPhotoAlbumColumns(columns);
593 if (dto.albumSubType == PhotoAlbumSubType::HIGHLIGHT ||
594 dto.albumSubType == PhotoAlbumSubType::HIGHLIGHT_SUGGESTIONS) {
595 AddHighlightAlbumPredicates(dto.predicates, dto.albumSubType);
596 std::string analysisAlbumId = ANALYSIS_ALBUM_TABLE + "." + PhotoAlbumColumns::ALBUM_ID +
597 " AS " + PhotoAlbumColumns::ALBUM_ID;
598 ReplaceFetchColumn(columns, PhotoAlbumColumns::ALBUM_ID, analysisAlbumId);
599 }
600 AddPhotoAlbumTypeFilter(dto.predicates, dto.albumType, dto.albumSubType);
601 GenerateAnalysisCmd(cmd, dto.predicates);
602 resultSet = MediaLibraryDataManager::QueryAnalysisAlbum(cmd, columns, dto.predicates);
603 sqlStr = cmd.GetAbsRdbPredicates()->GetStatement();
604 }
605 } else {
606 AddNoSmartFetchColumns(columns);
607 AddPhotoAlbumTypeFilter(dto.predicates, dto.albumType, dto.albumSubType);
608 NativeRdb::RdbPredicates rdbPredicate = RdbUtils::ToPredicates(dto.predicates, PhotoAlbumColumns::TABLE);
609 if (rdbPredicate.GetOrder().empty()) {
610 rdbPredicate.OrderByAsc(PhotoAlbumColumns::ALBUM_ORDER);
611 }
612 resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicate, columns);
613 sqlStr = rdbPredicate.GetStatement();
614 }
615 int64_t totalCostTime = MediaFileUtils::UTCTimeMilliSeconds() - startTime;
616 AccurateRefresh::DfxRefreshManager::QueryStatementReport(
617 AccurateRefresh::DEAL_ALBUMS_BUSSINESS_NAME, totalCostTime, sqlStr);
618 LogQueryParams(dto.predicates, columns);
619
620 CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, E_HAS_DB_ERROR, "resultSet nullptr");
621 auto bridge = RdbUtils::ToResultSetBridge(resultSet);
622 dto.resultSet = make_shared<DataShare::DataShareResultSet>(bridge);
623 return E_OK;
624 }
625
QueryHiddenAlbums(QueryAlbumsDto & dto)626 int32_t MediaAlbumsService::QueryHiddenAlbums(QueryAlbumsDto &dto)
627 {
628 std::vector<std::string> &columns = dto.columns;
629 if (!CheckAlbumFetchColumns(columns)) {
630 return E_INVALID_VALUES;
631 }
632
633 AddNoSmartFetchColumns(columns);
634 if (dto.hiddenAlbumFetchMode == 1) {
635 columns.push_back(PhotoAlbumColumns::HIDDEN_COUNT);
636 columns.push_back(PhotoAlbumColumns::HIDDEN_COVER);
637 dto.predicates.And()->EqualTo(PhotoAlbumColumns::CONTAINS_HIDDEN, to_string(1));
638 dto.predicates.And()->NotEqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, PhotoAlbumSubType::HIDDEN);
639 dto.predicates.And()->NotEqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, PhotoAlbumSubType::TRASH);
640 } else {
641 dto.predicates.And()->EqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, PhotoAlbumSubType::HIDDEN);
642 }
643
644 NativeRdb::RdbPredicates rdbPredicate = RdbUtils::ToPredicates(dto.predicates, PhotoAlbumColumns::TABLE);
645 if (rdbPredicate.GetOrder().empty()) {
646 rdbPredicate.OrderByAsc(PhotoAlbumColumns::ALBUM_ORDER);
647 }
648
649 std::shared_ptr<NativeRdb::ResultSet> resultSet;
650 MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(columns);
651 resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicate, columns);
652
653 LogQueryParams(dto.predicates, columns);
654
655 CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, E_HAS_DB_ERROR, "resultSet nullptr");
656 auto bridge = RdbUtils::ToResultSetBridge(resultSet);
657 dto.resultSet = make_shared<DataShare::DataShareResultSet>(bridge);
658 return E_OK;
659 }
660
GetOrderPosition(const GetOrderPositionDto & getOrderPositionDto,GetOrderPositionRespBody & resp)661 int32_t MediaAlbumsService::GetOrderPosition(const GetOrderPositionDto& getOrderPositionDto,
662 GetOrderPositionRespBody& resp)
663 {
664 NativeRdb::RdbPredicates predicates(ANALYSIS_PHOTO_MAP_TABLE);
665 const string mapTable = ANALYSIS_PHOTO_MAP_TABLE;
666 predicates.EqualTo(mapTable + "." + MAP_ALBUM, getOrderPositionDto.albumId)->
667 And()->In(mapTable + "." + MAP_ASSET, getOrderPositionDto.assetIdArray);
668 std::vector<std::string> fetchColumn{MAP_ASSET, ORDER_POSITION};
669
670 auto resultSet = MediaLibraryRdbStore::QueryWithFilter(predicates, fetchColumn);
671 if (resultSet == nullptr) {
672 MEDIA_ERR_LOG("query resultSet is nullptr");
673 return E_ERR;
674 }
675
676 int count = 0;
677 int ret = resultSet->GetRowCount(count);
678 if (ret != NativeRdb::E_OK || count <= 0) {
679 MEDIA_ERR_LOG("GetRowCount failed, error code: %{public}d, count: %{public}d", ret, count);
680 return JS_INNER_FAIL;
681 }
682 unordered_map<std::string, int32_t> idOrderMap;
683 while (resultSet->GoToNextRow() == NativeRdb::E_OK) {
684 int32_t mapAsset = get<int32_t>(ResultSetUtils::GetValFromColumn(MAP_ASSET, resultSet, TYPE_INT32));
685 int32_t orderPosition = get<int32_t>(ResultSetUtils::GetValFromColumn(ORDER_POSITION, resultSet, TYPE_INT32));
686 idOrderMap[std::to_string(mapAsset)] = orderPosition;
687 }
688 resp.orderPositionArray.clear();
689 for (const string& assetId : getOrderPositionDto.assetIdArray) {
690 resp.orderPositionArray.push_back(idOrderMap[assetId]);
691 }
692 return E_OK;
693 }
694
GetFaceId(int32_t albumId,string & groupTag)695 int32_t MediaAlbumsService::GetFaceId(int32_t albumId, string& groupTag)
696 {
697 return this->rdbOperation_.GetFaceId(albumId, groupTag);
698 }
699
GetPhotoIndex(GetPhotoIndexReqBody & reqBody,QueryResultRespBody & respBody)700 int32_t MediaAlbumsService::GetPhotoIndex(GetPhotoIndexReqBody &reqBody, QueryResultRespBody &respBody)
701 {
702 DataShare::DataSharePredicates &predicates = reqBody.predicates;
703 predicates.And()->EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0));
704 predicates.And()->EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0));
705 predicates.And()->EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(0));
706 predicates.And()->EqualTo(PhotoColumn::PHOTO_IS_TEMP, to_string(0));
707 predicates.And()->EqualTo(PhotoColumn::PHOTO_BURST_COVER_LEVEL,
708 to_string(static_cast<int32_t>(BurstCoverLevelType::COVER)));
709 const string &photoId = reqBody.photoId;
710 const string &albumId = reqBody.albumId;
711 MEDIA_INFO_LOG("GetPhotoIndex photoId:%{public}s, albumId:%{public}s", photoId.c_str(), albumId.c_str());
712
713 MediaLibraryCommand cmd(predicates);
714 shared_ptr<NativeRdb::ResultSet> resSet = nullptr;
715 if (reqBody.isAnalysisAlbum) {
716 resSet = MediaLibraryPhotoOperations::HandleAnalysisIndex(cmd, photoId, albumId);
717 } else {
718 NativeRdb::RdbPredicates predicates =
719 RdbDataShareAdapter::RdbUtils::ToPredicates(cmd.GetDataSharePred(), PhotoColumn::PHOTOS_TABLE);
720 resSet = MediaLibraryPhotoOperations::HandleIndexOfUri(cmd, predicates, photoId, albumId);
721 }
722 if (resSet == nullptr) {
723 return E_FAIL;
724 }
725 auto resultSetBridge = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(resSet);
726 respBody.resultSet = make_shared<DataShare::DataShareResultSet>(resultSetBridge);
727 return E_SUCCESS;
728 }
729
GetAnalysisProcess(GetAnalysisProcessReqBody & reqBody,QueryResultRespBody & respBody)730 int32_t MediaAlbumsService::GetAnalysisProcess(GetAnalysisProcessReqBody &reqBody, QueryResultRespBody &respBody)
731 {
732 std::string tableName;
733 DataShare::DataSharePredicates predicates;
734 std::vector<std::string> columns;
735 if (reqBody.analysisType == static_cast<int32_t>(AnalysisType::ANALYSIS_LABEL)) {
736 tableName = VISION_TOTAL_TABLE;
737 columns = {
738 "COUNT(*) AS totalCount",
739 "SUM(CASE WHEN ((aesthetics_score != 0 AND label != 0 AND ocr != 0 AND face != 0 AND face != 1 "
740 "AND face != 2 "
741 "AND saliency != 0 AND segmentation != 0 AND head != 0 AND Photos.media_type = 1) OR "
742 "(label != 0 AND face != 0 AND Photos.media_type = 2)) THEN 1 ELSE 0 END) AS finishedCount",
743 "SUM(CASE WHEN label != 0 THEN 1 ELSE 0 END) AS LabelCount"
744 };
745 string clause = VISION_TOTAL_TABLE + "." + MediaColumn::MEDIA_ID + " = " + PhotoColumn::PHOTOS_TABLE+ "." +
746 MediaColumn::MEDIA_ID;
747 predicates.InnerJoin(PhotoColumn::PHOTOS_TABLE)->On({ clause });
748 predicates.EqualTo(PhotoColumn::PHOTO_HIDDEN_TIME, 0)->And()
749 ->EqualTo(MediaColumn::MEDIA_DATE_TRASHED, 0)->And()
750 ->EqualTo(MediaColumn::MEDIA_TIME_PENDING, 0);
751 } else if (reqBody.analysisType == static_cast<int32_t>(AnalysisType::ANALYSIS_FACE)) {
752 tableName = USER_PHOTOGRAPHY_INFO_TABLE;
753 std::vector<std::string> columns = {
754 HIGHLIGHT_ANALYSIS_PROGRESS
755 };
756 } else if (reqBody.analysisType == static_cast<int32_t>(AnalysisType::ANALYSIS_HIGHLIGHT)) {
757 tableName = HIGHLIGHT_ALBUM_TABLE;
758 columns = {
759 "SUM(CASE WHEN highlight_status = -3 THEN 1 ELSE 0 END) AS ClearCount",
760 "SUM(CASE WHEN highlight_status = -2 THEN 1 ELSE 0 END) AS DeleteCount",
761 "SUM(CASE WHEN highlight_status = -1 THEN 1 ELSE 0 END) AS NotProduceCount",
762 "SUM(CASE WHEN highlight_status > 0 THEN 1 ELSE 0 END) AS ProduceCount",
763 "SUM(CASE WHEN highlight_status = 1 THEN 1 ELSE 0 END) AS PushCount",
764 };
765 }
766 shared_ptr<NativeRdb::ResultSet> resSet = MediaLibraryRdbStore::QueryWithFilter(
767 RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, tableName), columns);
768 if (resSet == nullptr) {
769 return E_FAIL;
770 }
771 auto resultSetBridge = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(resSet);
772 respBody.resultSet = make_shared<DataShare::DataShareResultSet>(resultSetBridge);
773 return E_SUCCESS;
774 }
775
GetHighlightAlbumInfo(GetHighlightAlbumReqBody & reqBody,QueryResultRespBody & respBody)776 int32_t MediaAlbumsService::GetHighlightAlbumInfo(GetHighlightAlbumReqBody &reqBody, QueryResultRespBody &respBody)
777 {
778 std::vector<std::string> columns;
779 DataShare::DataSharePredicates predicates;
780
781 if (HIGHLIGHT_ALBUM_INFO_MAP.find(reqBody.highlightAlbumInfoType) != HIGHLIGHT_ALBUM_INFO_MAP.end()) {
782 columns = HIGHLIGHT_ALBUM_INFO_MAP.at(reqBody.highlightAlbumInfoType).fetchColumn;
783 string tabStr;
784 if (reqBody.highlightAlbumInfoType == COVER_INFO) {
785 tabStr = HIGHLIGHT_COVER_INFO_TABLE;
786 } else {
787 tabStr = HIGHLIGHT_PLAY_INFO_TABLE;
788 }
789 vector<string> onClause = {
790 tabStr + "." + PhotoAlbumColumns::ALBUM_ID + " = " +
791 HIGHLIGHT_ALBUM_TABLE + "." + ID
792 };
793 predicates.InnerJoin(HIGHLIGHT_ALBUM_TABLE)->On(onClause);
794 } else {
795 MEDIA_ERR_LOG("Invalid highlightAlbumInfoType");
796 return E_ERR;
797 }
798 int32_t albumId = reqBody.albumId;
799 int32_t subType = reqBody.subType;
800 if (subType == static_cast<int32_t>(PhotoAlbumSubType::HIGHLIGHT)) {
801 predicates.EqualTo(HIGHLIGHT_ALBUM_TABLE + "." + PhotoAlbumColumns::ALBUM_ID, to_string(albumId));
802 } else if (subType == static_cast<int32_t>(PhotoAlbumSubType::HIGHLIGHT_SUGGESTIONS)) {
803 predicates.EqualTo(HIGHLIGHT_ALBUM_TABLE + "." + AI_ALBUM_ID, to_string(albumId));
804 } else {
805 MEDIA_ERR_LOG("Invalid highlight album subType");
806 return E_ERR;
807 }
808
809 std::string tableName = "";
810 if (reqBody.highlightAlbumInfoType == static_cast<int32_t>(HighlightAlbumInfoType::COVER_INFO)) {
811 tableName = HIGHLIGHT_COVER_INFO_TABLE;
812 } else if (reqBody.highlightAlbumInfoType == static_cast<int32_t>(HighlightAlbumInfoType::PLAY_INFO)) {
813 tableName = HIGHLIGHT_PLAY_INFO_TABLE;
814 } else {
815 MEDIA_ERR_LOG("highlightAlbumInfoType not valid");
816 return E_ERR;
817 }
818
819 shared_ptr<NativeRdb::ResultSet> resSet = MediaLibraryRdbStore::QueryWithFilter(
820 RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, tableName), columns);
821 if (resSet == nullptr) {
822 return E_FAIL;
823 }
824 auto resultSetBridge = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(resSet);
825 respBody.resultSet = make_shared<DataShare::DataShareResultSet>(resultSetBridge);
826 return E_SUCCESS;
827 }
828
UpdatePhotoAlbumOrder(const SetPhotoAlbumOrderDto & setPhotoAlbumOrderDto)829 int32_t MediaAlbumsService::UpdatePhotoAlbumOrder(const SetPhotoAlbumOrderDto &setPhotoAlbumOrderDto)
830 {
831 CHECK_AND_RETURN_RET_LOG(setPhotoAlbumOrderDto.CheckArray(), E_INNER_FAIL,
832 "SetPhotoAlbumOrderDto can not be used to update album order");
833
834 vector<NativeRdb::ValuesBucket> valuesBuckets;
835 vector<NativeRdb::RdbPredicates> predicatesArray;
836 for (size_t i = 0; i < setPhotoAlbumOrderDto.albumIds.size(); i++) {
837 NativeRdb::RdbPredicates predicates(PhotoAlbumColumns::TABLE);
838 predicates.EqualTo(PhotoAlbumColumns::ALBUM_ID, setPhotoAlbumOrderDto.albumIds[i]);
839 predicatesArray.push_back(predicates);
840
841 NativeRdb::ValuesBucket valuesBucket;
842 valuesBucket.Put(setPhotoAlbumOrderDto.albumOrderColumn, setPhotoAlbumOrderDto.albumOrders[i]);
843 valuesBucket.Put(setPhotoAlbumOrderDto.orderSectionColumn, setPhotoAlbumOrderDto.orderSection[i]);
844 valuesBucket.Put(setPhotoAlbumOrderDto.orderTypeColumn, setPhotoAlbumOrderDto.orderType[i]);
845 valuesBucket.Put(setPhotoAlbumOrderDto.orderStatusColumn, setPhotoAlbumOrderDto.orderStatus[i]);
846 valuesBuckets.push_back(valuesBucket);
847 }
848
849 int32_t changedRows = MediaLibraryAlbumOperations::UpdatePhotoAlbumOrder(valuesBuckets, predicatesArray);
850 return changedRows;
851 }
852
MoveAssets(ChangeRequestMoveAssetsDto & moveAssetsDto)853 int32_t MediaAlbumsService::MoveAssets(ChangeRequestMoveAssetsDto &moveAssetsDto)
854 {
855 DataShare::DataSharePredicates predicates;
856 predicates.EqualTo(PhotoColumn::PHOTO_OWNER_ALBUM_ID, to_string(moveAssetsDto.albumId));
857 predicates.And();
858 predicates.In(PhotoColumn::MEDIA_ID, moveAssetsDto.assets);
859 NativeRdb::RdbPredicates rdbPredicate = RdbDataShareAdapter::RdbUtils::ToPredicates(predicates,
860 PhotoColumn::PHOTOS_TABLE);
861
862 NativeRdb::ValuesBucket value;
863 value.Put(PhotoColumn::PHOTO_OWNER_ALBUM_ID, moveAssetsDto.targetAlbumId);
864
865 MediaLibraryCommand cmd(OperationObject::PAH_PHOTO, OperationType::UPDATE, MediaLibraryApi::API_10);
866 cmd.SetValueBucket(value);
867 cmd.SetDataSharePred(predicates);
868 cmd.GetAbsRdbPredicates()->SetWhereClause(rdbPredicate.GetWhereClause());
869 cmd.GetAbsRdbPredicates()->SetWhereArgs(rdbPredicate.GetWhereArgs());
870 int32_t ret = MediaLibraryPhotoOperations::BatchSetOwnerAlbumId(cmd);
871
872 auto resultSet = this->rdbOperation_.MoveAssetsGetAlbumInfo(moveAssetsDto);
873 CHECK_AND_RETURN_RET(resultSet != nullptr, E_ERR);
874 while (resultSet->GoToNextRow() == E_OK) {
875 int32_t albumId = GetInt32Val(PhotoAlbumColumns::ALBUM_ID, resultSet);
876 int32_t albumImageCount = GetInt32Val(PhotoAlbumColumns::ALBUM_IMAGE_COUNT, resultSet);
877 int32_t albumVideoCount = GetInt32Val(PhotoAlbumColumns::ALBUM_VIDEO_COUNT, resultSet);
878 int32_t albumCount = GetInt32Val(PhotoAlbumColumns::ALBUM_COUNT, resultSet);
879 if (albumId == moveAssetsDto.albumId) {
880 moveAssetsDto.albumImageCount = albumImageCount;
881 moveAssetsDto.albumVideoCount = albumVideoCount;
882 moveAssetsDto.albumCount = albumCount;
883 continue;
884 }
885 moveAssetsDto.targetAlbumImageCount = albumImageCount;
886 moveAssetsDto.targetAlbumVideoCount = albumVideoCount;
887 moveAssetsDto.targetAlbumCount = albumCount;
888 }
889 resultSet->Close();
890 return ret;
891 }
892
AddAssets(ChangeRequestAddAssetsDto & addAssetsDto,ChangeRequestAddAssetsRespBody & respBody)893 int32_t MediaAlbumsService::AddAssets(ChangeRequestAddAssetsDto &addAssetsDto, ChangeRequestAddAssetsRespBody &respBody)
894 {
895 std::vector<DataShare::DataShareValuesBucket> valuesBuckets;
896 if (addAssetsDto.isHighlight) {
897 for (auto asset : addAssetsDto.assets) {
898 DataShare::DataShareValuesBucket pair;
899 pair.Put(MAP_ALBUM, addAssetsDto.albumId);
900 pair.Put(MAP_ASSET, asset);
901 valuesBuckets.push_back(pair);
902 }
903 return PhotoMapOperations::AddHighlightPhotoAssets(valuesBuckets);
904 }
905
906 for (auto asset : addAssetsDto.assets) {
907 DataShare::DataShareValuesBucket pair;
908 pair.Put(PhotoColumn::PHOTO_OWNER_ALBUM_ID, addAssetsDto.albumId);
909 pair.Put(PhotoColumn::MEDIA_ID, asset);
910 valuesBuckets.push_back(pair);
911 }
912 int32_t ret = PhotoMapOperations::AddPhotoAssets(valuesBuckets);
913
914 auto resultSet = this->rdbOperation_.AddAssetsGetAlbumInfo(addAssetsDto);
915 CHECK_AND_RETURN_RET(resultSet != nullptr, E_ERR);
916 if (resultSet->GoToFirstRow() == E_OK) {
917 if (!addAssetsDto.isHiddenOnly) {
918 respBody.imageCount = GetInt32Val(PhotoAlbumColumns::ALBUM_IMAGE_COUNT, resultSet);
919 respBody.videoCount = GetInt32Val(PhotoAlbumColumns::ALBUM_VIDEO_COUNT, resultSet);
920 }
921 respBody.albumCount = GetInt32Val(PhotoAlbumColumns::ALBUM_COUNT, resultSet);
922 }
923 resultSet->Close();
924 return ret;
925 }
926
RemoveAssets(ChangeRequestRemoveAssetsDto & removeAssetsDto,ChangeRequestRemoveAssetsRespBody & respBody)927 int32_t MediaAlbumsService::RemoveAssets(
928 ChangeRequestRemoveAssetsDto &removeAssetsDto, ChangeRequestRemoveAssetsRespBody &respBody)
929 {
930 DataShare::DataSharePredicates predicates;
931 predicates.EqualTo(PhotoColumn::PHOTO_OWNER_ALBUM_ID, to_string(removeAssetsDto.albumId));
932 predicates.In(PhotoColumn::MEDIA_ID, removeAssetsDto.assets);
933 NativeRdb::RdbPredicates rdbPredicate = RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, PhotoMap::TABLE);
934 int32_t ret = PhotoMapOperations::RemovePhotoAssets(rdbPredicate);
935
936 auto resultSet = this->rdbOperation_.RemoveAssetsGetAlbumInfo(removeAssetsDto);
937 CHECK_AND_RETURN_RET(resultSet != nullptr, E_ERR);
938 if (resultSet->GoToFirstRow() == E_OK) {
939 if (!removeAssetsDto.isHiddenOnly) {
940 respBody.imageCount = GetInt32Val(PhotoAlbumColumns::ALBUM_IMAGE_COUNT, resultSet);
941 respBody.videoCount = GetInt32Val(PhotoAlbumColumns::ALBUM_VIDEO_COUNT, resultSet);
942 }
943 respBody.albumCount = GetInt32Val(PhotoAlbumColumns::ALBUM_COUNT, resultSet);
944 }
945 resultSet->Close();
946 return ret;
947 }
948
RecoverAssets(ChangeRequestRecoverAssetsDto & recoverAssetsDto)949 int32_t MediaAlbumsService::RecoverAssets(ChangeRequestRecoverAssetsDto &recoverAssetsDto)
950 {
951 DataShare::DataSharePredicates predicates;
952 predicates.In(PhotoColumn::MEDIA_ID, recoverAssetsDto.assets);
953 return MediaLibraryAlbumOperations::RecoverPhotoAssets(predicates);
954 }
955
DeleteAssets(ChangeRequestDeleteAssetsDto & deleteAssetsDto)956 int32_t MediaAlbumsService::DeleteAssets(ChangeRequestDeleteAssetsDto &deleteAssetsDto)
957 {
958 DataShare::DataSharePredicates predicates;
959 predicates.In(PhotoColumn::MEDIA_ID, deleteAssetsDto.assets);
960 predicates.GreaterThan(PhotoColumn::MEDIA_DATE_TRASHED, 0);
961 return MediaLibraryAlbumOperations::DeletePhotoAssets(predicates, false, false);
962 }
963
DismissAssets(ChangeRequestDismissAssetsDto & dismissAssetsDto)964 int32_t MediaAlbumsService::DismissAssets(ChangeRequestDismissAssetsDto &dismissAssetsDto)
965 {
966 DataShare::DataSharePredicates predicates;
967 predicates.EqualTo(MAP_ALBUM, to_string(dismissAssetsDto.albumId));
968 predicates.In(MAP_ASSET, dismissAssetsDto.assets);
969 predicates.EqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, to_string(dismissAssetsDto.photoAlbumSubType));
970 NativeRdb::RdbPredicates rdbPredicate =
971 RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, ANALYSIS_PHOTO_MAP_TABLE);
972 int32_t ret = PhotoMapOperations::DismissAssets(rdbPredicate);
973 if (ret < 0) {
974 MEDIA_ERR_LOG("DismissAssets Error, ret: %{public}d", ret);
975 return ret;
976 }
977 if (dismissAssetsDto.photoAlbumSubType == PhotoAlbumSubType::PORTRAIT) {
978 DataShare::DataShareValuesBucket updateValues;
979 const int32_t PORTRAIT_REMOVED = -3;
980 const std::string TAG_ID = "tag_id";
981 updateValues.Put(TAG_ID, std::to_string(PORTRAIT_REMOVED));
982 NativeRdb::ValuesBucket value = RdbDataShareAdapter::RdbUtils::ToValuesBucket(updateValues);
983 DataShare::DataSharePredicates updatePredicates;
984 std::string selection = std::to_string(dismissAssetsDto.albumId);
985 for (size_t i = 0; i < dismissAssetsDto.assets.size(); ++i) {
986 selection += "," + dismissAssetsDto.assets[i];
987 }
988 updatePredicates.SetWhereClause(selection);
989 NativeRdb::RdbPredicates rdbPredicateUpdate =
990 RdbDataShareAdapter::RdbUtils::ToPredicates(updatePredicates, VISION_IMAGE_FACE_TABLE);
991
992 MediaLibraryCommand cmd(OperationObject::VISION_IMAGE_FACE, OperationType::UPDATE, MediaLibraryApi::API_10);
993 cmd.SetValueBucket(value);
994 cmd.SetDataSharePred(updatePredicates);
995 cmd.GetAbsRdbPredicates()->SetWhereClause(rdbPredicateUpdate.GetWhereClause());
996 cmd.GetAbsRdbPredicates()->SetWhereArgs(rdbPredicateUpdate.GetWhereArgs());
997 cmd.SetApiParam(MEDIA_OPERN_KEYWORD, UPDATE_DISMISS_ASSET);
998 auto dataManager = MediaLibraryDataManager::GetInstance();
999 dataManager->HandleAnalysisFaceUpdate(cmd, value, updatePredicates);
1000 }
1001 return ret;
1002 }
1003
MergeAlbum(ChangeRequestMergeAlbumDto & mergeAlbumDto)1004 int32_t MediaAlbumsService::MergeAlbum(ChangeRequestMergeAlbumDto &mergeAlbumDto)
1005 {
1006 DataShare::DataShareValuesBucket valuesBucket;
1007 valuesBucket.Put(PhotoAlbumColumns::ALBUM_ID, mergeAlbumDto.albumId);
1008 valuesBucket.Put(TARGET_ALBUM_ID, mergeAlbumDto.targetAlbumId);
1009 NativeRdb::ValuesBucket value = RdbDataShareAdapter::RdbUtils::ToValuesBucket(valuesBucket);
1010 if (value.IsEmpty()) {
1011 MEDIA_ERR_LOG("MergeAlbum:Input parameter is invalid ");
1012 return E_INVALID_VALUES;
1013 }
1014 return MediaLibraryAlbumOperations::MergePortraitAlbums(value);
1015 }
1016
PlaceBefore(ChangeRequestPlaceBeforeDto & placeBeforeDto)1017 int32_t MediaAlbumsService::PlaceBefore(ChangeRequestPlaceBeforeDto &placeBeforeDto)
1018 {
1019 DataShare::DataShareValuesBucket valuesBucket;
1020 valuesBucket.Put(PhotoAlbumColumns::ALBUM_ID, placeBeforeDto.albumId);
1021 valuesBucket.Put(PhotoAlbumColumns::REFERENCE_ALBUM_ID, placeBeforeDto.referenceAlbumId);
1022 valuesBucket.Put(PhotoAlbumColumns::ALBUM_TYPE, placeBeforeDto.albumType);
1023 valuesBucket.Put(PhotoAlbumColumns::ALBUM_SUBTYPE, placeBeforeDto.albumSubType);
1024 NativeRdb::ValuesBucket value = RdbDataShareAdapter::RdbUtils::ToValuesBucket(valuesBucket);
1025 if (value.IsEmpty()) {
1026 MEDIA_ERR_LOG("PlaceBefore:Input parameter is invalid ");
1027 return E_INVALID_VALUES;
1028 }
1029
1030 return MediaLibraryAlbumOperations::OrderSingleAlbum(value);
1031 }
1032
SetOrderPosition(ChangeRequestSetOrderPositionDto & setOrderPositionDto)1033 int32_t MediaAlbumsService::SetOrderPosition(ChangeRequestSetOrderPositionDto &setOrderPositionDto)
1034 {
1035 MediaLibraryCommand cmd(OperationObject::ANALYSIS_PHOTO_MAP, OperationType::UPDATE_ORDER, MediaLibraryApi::API_10);
1036 DataShare::DataShareValuesBucket valuesBucket;
1037 valuesBucket.Put(ORDER_POSITION, setOrderPositionDto.orderString);
1038 NativeRdb::ValuesBucket value = RdbDataShareAdapter::RdbUtils::ToValuesBucket(valuesBucket);
1039 if (value.IsEmpty()) {
1040 MEDIA_ERR_LOG("SetOrderPosition:Input parameter is invalid ");
1041 return E_INVALID_VALUES;
1042 }
1043
1044 const string mapTable = ANALYSIS_PHOTO_MAP_TABLE;
1045 DataShare::DataSharePredicates predicates;
1046 predicates.EqualTo(mapTable + "." + MAP_ALBUM, setOrderPositionDto.albumId)
1047 ->And()
1048 ->In(mapTable + "." + MAP_ASSET, setOrderPositionDto.assetIds);
1049 NativeRdb::RdbPredicates rdbPredicate =
1050 RdbDataShareAdapter::RdbUtils::ToPredicates(predicates, ANALYSIS_PHOTO_MAP_TABLE);
1051 cmd.SetValueBucket(value);
1052 cmd.SetDataSharePred(predicates);
1053 cmd.GetAbsRdbPredicates()->SetWhereClause(rdbPredicate.GetWhereClause());
1054 cmd.GetAbsRdbPredicates()->SetWhereArgs(rdbPredicate.GetWhereArgs());
1055 return MediaLibraryAnalysisAlbumOperations::SetAnalysisAlbumOrderPosition(cmd);
1056 }
1057
GetAlbumsByIds(GetAlbumsByIdsDto & getAlbumsByIdsDto,GetAlbumsByIdsRespBody & respBody)1058 int32_t MediaAlbumsService::GetAlbumsByIds(GetAlbumsByIdsDto &getAlbumsByIdsDto, GetAlbumsByIdsRespBody &respBody)
1059 {
1060 std::vector<std::string> columns = getAlbumsByIdsDto.columns;
1061 MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(columns);
1062
1063 NativeRdb::RdbPredicates rdbPredicates =
1064 RdbDataShareAdapter::RdbUtils::ToPredicates(getAlbumsByIdsDto.predicates, PhotoAlbumColumns::TABLE);
1065 if (rdbPredicates.GetOrder().empty()) {
1066 rdbPredicates.OrderByAsc(PhotoAlbumColumns::ALBUM_ORDER);
1067 }
1068
1069 auto resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicates, columns);
1070 if (resultSet != nullptr) {
1071 auto bridge = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(resultSet);
1072 respBody.resultSet = make_shared<DataShare::DataShareResultSet>(bridge);
1073 }
1074
1075 return E_OK;
1076 }
1077
GetPhotoAlbumObject(GetPhotoAlbumObjectDto & getPhotoAlbumObjectDto,GetPhotoAlbumObjectRespBody & respBody)1078 int32_t MediaAlbumsService::GetPhotoAlbumObject(
1079 GetPhotoAlbumObjectDto &getPhotoAlbumObjectDto, GetPhotoAlbumObjectRespBody &respBody)
1080 {
1081 std::vector<std::string> columns = getPhotoAlbumObjectDto.columns;
1082 NativeRdb::RdbPredicates rdbPredicates =
1083 RdbDataShareAdapter::RdbUtils::ToPredicates(getPhotoAlbumObjectDto.predicates, PhotoAlbumColumns::TABLE);
1084
1085 auto resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicates, columns);
1086 if (resultSet != nullptr) {
1087 auto bridge = RdbDataShareAdapter::RdbUtils::ToResultSetBridge(resultSet);
1088 respBody.resultSet = make_shared<DataShare::DataShareResultSet>(bridge);
1089 }
1090 return E_OK;
1091 }
1092
QueryAlbumsLpath(QueryAlbumsDto & dto)1093 int32_t MediaAlbumsService::QueryAlbumsLpath(QueryAlbumsDto &dto)
1094 {
1095 MEDIA_DEBUG_LOG("MediaAlbumsService::QueryAlbumsLpath Start");
1096 std::shared_ptr<NativeRdb::ResultSet> resultSet;
1097 std::vector<std::string> &columns = dto.columns;
1098 MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(columns);
1099 NativeRdb::RdbPredicates rdbPredicates = RdbUtils::ToPredicates(dto.predicates, PhotoAlbumColumns::TABLE);
1100 if (rdbPredicates.GetOrder().empty()) {
1101 rdbPredicates.OrderByAsc(PhotoAlbumColumns::ALBUM_ORDER);
1102 }
1103 resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicates, columns);
1104
1105 LogQueryParams(dto.predicates, columns);
1106
1107 CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, E_HAS_DB_ERROR, "resultSet nullptr");
1108 auto bridge = RdbUtils::ToResultSetBridge(resultSet);
1109 dto.resultSet = make_shared<DataShare::DataShareResultSet>(bridge);
1110 MEDIA_DEBUG_LOG("MediaAlbumsService::QueryAlbumsLpath End");
1111 return E_OK;
1112 }
1113
QueryAlbumsLpaths(QueryAlbumsDto & dto)1114 int32_t MediaAlbumsService::QueryAlbumsLpaths(QueryAlbumsDto &dto)
1115 {
1116 MEDIA_DEBUG_LOG("MediaAlbumsService::QueryAlbumsLpaths Start");
1117 std::shared_ptr<NativeRdb::ResultSet> resultSet;
1118 std::vector<std::string> &columns = dto.columns;
1119 MediaLibraryRdbUtils::AddVirtualColumnsOfDateType(columns);
1120 if (dto.albumType == PhotoAlbumType::USER || dto.albumType == PhotoAlbumType::SOURCE) {
1121 dto.predicates.And()
1122 ->EqualTo(PhotoAlbumColumns::ALBUM_TYPE, std::to_string(dto.albumType))
1123 ->And()
1124 ->EqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, std::to_string(dto.albumSubType));
1125 NativeRdb::RdbPredicates rdbPredicates = RdbUtils::ToPredicates(dto.predicates, PhotoAlbumColumns::TABLE);
1126 if (rdbPredicates.GetOrder().empty()) {
1127 rdbPredicates.OrderByAsc(PhotoAlbumColumns::ALBUM_ORDER);
1128 }
1129 resultSet = MediaLibraryRdbStore::QueryWithFilter(rdbPredicates, columns);
1130 }
1131
1132 LogQueryParams(dto.predicates, columns);
1133
1134 CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, E_HAS_DB_ERROR, "resultSet nullptr");
1135 auto bridge = RdbUtils::ToResultSetBridge(resultSet);
1136 dto.resultSet = make_shared<DataShare::DataShareResultSet>(bridge);
1137 MEDIA_DEBUG_LOG("MediaAlbumsService::QueryAlbumsLpaths End");
1138 return E_OK;
1139 }
1140 } // namespace OHOS::Media