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 "AccurateRefresh::AlbumDataManager"
17
18 #include "media_file_utils.h"
19 #include "album_data_manager.h"
20 #include "medialibrary_unistore_manager.h"
21 #include "accurate_debug_log.h"
22 #include "medialibrary_data_manager_utils.h"
23 #include "medialibrary_tracer.h"
24
25 using namespace std;
26 using namespace OHOS::NativeRdb;
27
28 namespace OHOS {
29 namespace Media::AccurateRefresh {
30
InitAlbumInfos(const vector<int> & albumIds)31 int32_t AlbumDataManager::InitAlbumInfos(const vector<int> &albumIds)
32 {
33 if (albumIds.empty()) {
34 MEDIA_WARN_LOG("albumIds empty.");
35 return ACCURATE_REFRESH_INPUT_PARA_ERR;
36 }
37
38 MediaLibraryTracer tracer;
39 tracer.Start("AlbumDataManager::InitAlbumInfos");
40
41 auto initDatas = GetAlbumInfos(albumIds);
42 if (initDatas.empty()) {
43 MEDIA_WARN_LOG("initDatas empty.");
44 } else {
45 InsertInitChangeInfos(initDatas);
46 }
47
48 return ACCURATE_REFRESH_RET_OK;
49 }
50
51
UpdateModifiedDatas()52 int32_t AlbumDataManager::UpdateModifiedDatas()
53 {
54 return ACCURATE_REFRESH_RET_OK;
55 }
56
GetPhotoAssetInfo(int32_t fileId)57 PhotoAssetChangeInfo AlbumDataManager::GetPhotoAssetInfo(int32_t fileId)
58 {
59 MediaLibraryTracer tracer;
60 tracer.Start("AlbumDataManager::GetPhotoAssetInfo");
61 AbsRdbPredicates predicates(PhotoColumn::PHOTOS_TABLE);
62 auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
63 CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, PhotoAssetChangeInfo(), "rdbStore null");
64 predicates.EqualTo(PhotoColumn::MEDIA_ID, to_string(fileId));
65 auto resultSet = rdbStore->QueryByStep(predicates, PhotoAssetChangeInfo::GetPhotoAssetColumns());
66 CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, PhotoAssetChangeInfo(), "resultSet null");
67 auto changeInfos = PhotoAssetChangeInfo::GetInfoFromResult(resultSet,
68 PhotoAssetChangeInfo::GetPhotoAssetColumns());
69 resultSet->Close();
70 if (changeInfos.size() != 1) {
71 MEDIA_WARN_LOG("changeInfos[%{public}d] size[%{public}zu] wrong.", fileId, changeInfos.size());
72 return PhotoAssetChangeInfo();
73 }
74 return changeInfos[0];
75 }
76
PostProcessModifiedDatas(const std::vector<int32_t> & keys)77 int32_t AlbumDataManager::PostProcessModifiedDatas(const std::vector<int32_t> &keys)
78 {
79 MediaLibraryTracer tracer;
80 tracer.Start("AlbumDataManager::PostProcessModifiedDatas");
81 for (auto &key : keys) {
82 auto item = changeDatas_.find(key);
83 if (item == changeDatas_.end()) {
84 MEDIA_WARN_LOG("no data, albumId[%{public}d].", key);
85 continue;
86 }
87 auto &before = item->second.infoBeforeChange_;
88 auto &after = item->second.infoAfterChange_;
89 // 更新cover相关信息
90 if (before.coverUri_ != after.coverUri_) {
91 after.isCoverChange_ = true;
92 if (after.coverInfo_.fileId_ == INVALID_INT32_VALUE && !after.coverUri_.empty()) {
93 auto coverFileId = MediaLibraryDataManagerUtils::GetFileIdNumFromPhotoUri(after.coverUri_);
94 after.coverInfo_ = GetPhotoAssetInfo(coverFileId);
95 }
96 }
97
98 // 更新hidden cover相关信息
99 if (before.hiddenCoverUri_ != after.hiddenCoverUri_) {
100 after.isHiddenCoverChange_ = true;
101 if (after.hiddenCoverInfo_.fileId_ == INVALID_INT32_VALUE && !after.hiddenCoverUri_.empty()) {
102 auto coverFileId = MediaLibraryDataManagerUtils::GetFileIdNumFromPhotoUri(after.hiddenCoverUri_);
103 after.hiddenCoverInfo_ = GetPhotoAssetInfo(coverFileId);
104 }
105 }
106 ACCURATE_DEBUG("coverChange[%{public}d]:[%{public}s] hiddenCoverChange[%{public}d]:[%{public}s]",
107 after.isCoverChange_, after.coverInfo_.ToString().c_str(), after.isHiddenCoverChange_,
108 after.hiddenCoverInfo_.ToString().c_str());
109 }
110 return ACCURATE_REFRESH_RET_OK;
111 }
112
GetChangeInfoKey(const AlbumChangeInfo & changeInfo)113 int32_t AlbumDataManager::GetChangeInfoKey(const AlbumChangeInfo &changeInfo)
114 {
115 return changeInfo.albumId_;
116 }
117
GetInfoByKeys(const vector<int32_t> & albumIds)118 vector<AlbumChangeInfo> AlbumDataManager::GetInfoByKeys(const vector<int32_t> &albumIds)
119 {
120 return GetAlbumInfos(albumIds);
121 }
122
GetInfosByPredicates(const AbsRdbPredicates & predicates)123 vector<AlbumChangeInfo> AlbumDataManager::GetInfosByPredicates(const AbsRdbPredicates &predicates)
124 {
125 MediaLibraryTracer tracer;
126 tracer.Start("AlbumDataManager::GetInfosByPredicates");
127 shared_ptr<ResultSet> resultSet;
128 if (CanTransOperate()) {
129 resultSet = trans_->QueryByStep(predicates, AlbumChangeInfo::GetAlbumInfoColumns());
130 } else {
131 auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
132 CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, vector<AlbumChangeInfo>(), "rdbStore null");
133 resultSet = rdbStore->QueryByStep(predicates, AlbumChangeInfo::GetAlbumInfoColumns());
134 }
135 CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, vector<AlbumChangeInfo>(), "resultSet null");
136
137 // 根据resultSet转AlbumChangeInfo
138 auto albumInfos = GetInfosByResult(resultSet);
139 resultSet->Close();
140
141 return albumInfos;
142 }
143
GetInfosByResult(const shared_ptr<ResultSet> & resultSet)144 vector<AlbumChangeInfo> AlbumDataManager::GetInfosByResult(const shared_ptr<ResultSet> &resultSet)
145 {
146 return AlbumChangeInfo::GetInfoFromResult(resultSet, AlbumChangeInfo::GetAlbumInfoColumns());
147 }
148
GetAlbumInfos(const vector<int32_t> & albumIds,const vector<string> systemTypes)149 vector<AlbumChangeInfo> AlbumDataManager::GetAlbumInfos(const vector<int32_t> &albumIds,
150 const vector<string> systemTypes)
151 {
152 vector<AlbumChangeInfo> albumInfos;
153 if (!systemTypes.empty()) {
154 RdbPredicates predicates(PhotoAlbumColumns::TABLE);
155 predicates.In(PhotoAlbumColumns::ALBUM_SUBTYPE, systemTypes);
156 albumInfos = GetInfosByPredicates(predicates);
157 }
158
159 if (!albumIds.empty()) {
160 vector<string> albumIdStrs;
161 for (auto const &albumId : albumIds) {
162 albumIdStrs.push_back(to_string(static_cast<int> (albumId)));
163 }
164 vector<AlbumChangeInfo> albumIdInfos;
165 RdbPredicates predicates(PhotoAlbumColumns::TABLE);
166 predicates.In(PhotoAlbumColumns::ALBUM_ID, albumIdStrs);
167 albumIdInfos = GetInfosByPredicates(predicates);
168 albumInfos.insert(albumInfos.end(), albumIdInfos.begin(), albumIdInfos.end());
169 }
170 return albumInfos;
171 }
172
GetInitAlbumInfos()173 unordered_map<int32_t, AlbumChangeInfo> AlbumDataManager::GetInitAlbumInfos()
174 {
175 unordered_map<int32_t, AlbumChangeInfo> initAlbumInfos;
176 for (auto &item : changeDatas_) {
177 initAlbumInfos.emplace(item.first, item.second.infoBeforeChange_);
178 }
179 return initAlbumInfos;
180 }
181
GetInitKeys()182 vector<int32_t> AlbumDataManager::GetInitKeys()
183 {
184 stringstream ss;
185 ss << "GetInitKeys:";
186 vector<int32_t> albumIds;
187 for (auto &changeData : changeDatas_) {
188 albumIds.push_back(changeData.first);
189 ss << " " << changeData.first;
190 }
191
192 ACCURATE_DEBUG("%{public}s", ss.str().c_str());
193 return albumIds;
194 }
195
GetAlbumDatasFromAddAlbum(const vector<string> & albumIdsStr)196 vector<AlbumChangeData> AlbumDataManager::GetAlbumDatasFromAddAlbum(const vector<string> &albumIdsStr)
197 {
198 RdbPredicates predicates(PhotoAlbumColumns::TABLE);
199 predicates.In(PhotoAlbumColumns::ALBUM_ID, albumIdsStr);
200 if (albumIdsStr.size() > 0) {
201 ACCURATE_DEBUG("albumId: %{public}s", albumIdsStr[0].c_str());
202 } else {
203 ACCURATE_DEBUG("albumId empty");
204 }
205
206 auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
207 vector<AlbumChangeData> albumChangeDatas;
208 CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, albumChangeDatas, "rdbStore null");
209 auto resultSet = rdbStore->QueryByStep(predicates, AlbumChangeInfo::GetAlbumInfoColumns());
210 CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, albumChangeDatas, "resultSet null");
211 auto albumIdInfos = AlbumChangeInfo::GetInfoFromResult(resultSet, AlbumChangeInfo::GetAlbumInfoColumns());
212 resultSet->Close();
213 for (auto &albumInfo : albumIdInfos) {
214 AlbumChangeData changeData;
215 changeData.operation_ = RDB_OPERATION_ADD;
216 changeData.version_ = MediaFileUtils::UTCTimeMilliSeconds();
217 changeData.infoAfterChange_ = albumInfo;
218 albumChangeDatas.push_back(changeData);
219 ACCURATE_DEBUG("albumInfo: %{public}s", albumInfo.ToString().c_str());
220 }
221 return albumChangeDatas;
222 }
223 } // namespace Media
224 } // namespace OHOS
225