• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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