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::PhotoAssetChangeInfo"
17
18 #include <sstream>
19
20 #include "parameters.h"
21 #include "photo_asset_change_info.h"
22 #include "result_set_utils.h"
23 #include "media_file_utils.h"
24 #include "photo_album_column.h"
25 #include "accurate_debug_log.h"
26
27 using namespace std;
28 using namespace OHOS::NativeRdb;
29
30 namespace OHOS {
31 namespace Media::AccurateRefresh {
32
33 int32_t accurateDebugLevel = std::stoi(system::GetParameter("ohos.medialibrary.accurate_refreh.debug", "3"));
34
35 const map<std::string, ResultSetDataType> PhotoAssetChangeInfo::photoAssetCloumnTypes_ = {
36 { PhotoColumn::MEDIA_ID, TYPE_INT32 },
37 { PhotoColumn::PHOTO_DATE_DAY, TYPE_STRING },
38
39 { PhotoColumn::MEDIA_IS_FAV, TYPE_INT32 },
40 { PhotoColumn::MEDIA_TYPE, TYPE_INT32 },
41 { PhotoColumn::MEDIA_HIDDEN, TYPE_INT32 },
42 { PhotoColumn::MEDIA_DATE_TRASHED, TYPE_INT64 },
43 { PhotoColumn::PHOTO_STRONG_ASSOCIATION, TYPE_INT32 },
44 { PhotoColumn::PHOTO_THUMBNAIL_VISIBLE, TYPE_INT32 },
45
46 { PhotoColumn::MEDIA_DATE_ADDED, TYPE_INT64 },
47 { PhotoColumn::MEDIA_DATE_TAKEN, TYPE_INT64 },
48
49 { PhotoColumn::PHOTO_SUBTYPE, TYPE_INT32 },
50 { PhotoColumn::PHOTO_SYNC_STATUS, TYPE_INT32 },
51 { PhotoColumn::PHOTO_CLEAN_FLAG, TYPE_INT32 },
52 { PhotoColumn::MEDIA_TIME_PENDING, TYPE_INT32 },
53 { PhotoColumn::PHOTO_IS_TEMP, TYPE_INT32 },
54 { PhotoColumn::PHOTO_BURST_COVER_LEVEL, TYPE_INT32 },
55
56 { PhotoColumn::PHOTO_OWNER_ALBUM_ID, TYPE_INT32 },
57 { PhotoColumn::PHOTO_HIDDEN_TIME, TYPE_INT64 },
58 { PhotoColumn::PHOTO_THUMBNAIL_READY, TYPE_INT64 },
59 { PhotoColumn::MEDIA_NAME, TYPE_STRING },
60 { PhotoColumn::MEDIA_FILE_PATH, TYPE_STRING },
61 { PhotoColumn::PHOTO_DIRTY, TYPE_INT32 },
62 { PhotoColumn::PHOTO_POSITION, TYPE_INT32 },
63 { PhotoColumn::MEDIA_SIZE, TYPE_INT64 },
64 };
65
__anon9ed21e5f0102() 66 const vector<std::string> PhotoAssetChangeInfo::photoAssetColumns_ = []() {
67 vector<string> result;
68 for (const auto &item : photoAssetCloumnTypes_) {
69 result.push_back(item.first);
70 }
71 return result;
72 }();
73
GetPhotoAssetColumns()74 const vector<string>& PhotoAssetChangeInfo::GetPhotoAssetColumns()
75 {
76 return photoAssetColumns_;
77 }
78
GetInfoFromResult(const shared_ptr<ResultSet> & resultSet,const vector<string> & columns)79 vector<PhotoAssetChangeInfo> PhotoAssetChangeInfo::GetInfoFromResult(const shared_ptr<ResultSet> &resultSet,
80 const vector<string> &columns)
81 {
82 vector<PhotoAssetChangeInfo> assetChangeInfos;
83 while (resultSet->GoToNextRow() == NativeRdb::E_OK) {
84 PhotoAssetChangeInfo assetChangeInfo;
85 assetChangeInfo.fileId_ = get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::MEDIA_ID, resultSet,
86 GetDataType(PhotoColumn::MEDIA_ID)));
87 assetChangeInfo.dateDay_ = get<string>(ResultSetUtils::GetValFromColumn(PhotoColumn::PHOTO_DATE_DAY,
88 resultSet, GetDataType(PhotoColumn::PHOTO_DATE_DAY)));
89 assetChangeInfo.isFavorite_ = get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::MEDIA_IS_FAV,
90 resultSet, GetDataType(PhotoColumn::MEDIA_IS_FAV)));
91 assetChangeInfo.mediaType_ = get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::MEDIA_TYPE, resultSet,
92 GetDataType(PhotoColumn::MEDIA_TYPE)));
93 assetChangeInfo.isHidden_ = get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::MEDIA_HIDDEN, resultSet,
94 GetDataType(PhotoColumn::MEDIA_HIDDEN)));
95 assetChangeInfo.dateTrashedMs_ = get<int64_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::MEDIA_DATE_TRASHED,
96 resultSet, GetDataType(PhotoColumn::MEDIA_DATE_TRASHED)));
97 assetChangeInfo.strongAssociation_ = get<int32_t>(ResultSetUtils::GetValFromColumn(
98 PhotoColumn::PHOTO_STRONG_ASSOCIATION, resultSet, GetDataType(PhotoColumn::PHOTO_STRONG_ASSOCIATION)));
99 assetChangeInfo.thumbnailVisible_ = get<int32_t>(ResultSetUtils::GetValFromColumn(
100 PhotoColumn::PHOTO_THUMBNAIL_VISIBLE, resultSet, GetDataType(PhotoColumn::PHOTO_THUMBNAIL_VISIBLE)));
101 assetChangeInfo.dateAddedMs_ = get<int64_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::MEDIA_DATE_ADDED,
102 resultSet, GetDataType(PhotoColumn::MEDIA_DATE_ADDED)));
103 assetChangeInfo.dateTakenMs_ = get<int64_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::MEDIA_DATE_TAKEN,
104 resultSet, GetDataType(PhotoColumn::MEDIA_DATE_TAKEN)));
105 assetChangeInfo.subType_ = get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::PHOTO_SUBTYPE, resultSet,
106 GetDataType(PhotoColumn::PHOTO_SUBTYPE)));
107 assetChangeInfo.syncStatus_ = get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::PHOTO_SYNC_STATUS,
108 resultSet, GetDataType(PhotoColumn::PHOTO_SYNC_STATUS)));
109 assetChangeInfo.cleanFlag_ = get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::PHOTO_CLEAN_FLAG,
110 resultSet, GetDataType(PhotoColumn::PHOTO_CLEAN_FLAG)));
111 assetChangeInfo.timePending_ = get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::MEDIA_TIME_PENDING,
112 resultSet, GetDataType(PhotoColumn::MEDIA_TIME_PENDING)));
113 assetChangeInfo.isTemp_ = get<int32_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::PHOTO_IS_TEMP, resultSet,
114 GetDataType(PhotoColumn::PHOTO_IS_TEMP)));
115 assetChangeInfo.burstCoverLevel_ = get<int32_t>(ResultSetUtils::GetValFromColumn(
116 PhotoColumn::PHOTO_BURST_COVER_LEVEL, resultSet, GetDataType(PhotoColumn::PHOTO_BURST_COVER_LEVEL)));
117 assetChangeInfo.ownerAlbumId_ = get<int32_t>(ResultSetUtils::GetValFromColumn(
118 PhotoColumn::PHOTO_OWNER_ALBUM_ID, resultSet, GetDataType(PhotoColumn::PHOTO_OWNER_ALBUM_ID)));
119 assetChangeInfo.hiddenTime_ = get<int64_t>(ResultSetUtils::GetValFromColumn(PhotoColumn::PHOTO_HIDDEN_TIME,
120 resultSet, GetDataType(PhotoColumn::PHOTO_HIDDEN_TIME)));
121 assetChangeInfo.thumbnailReady_ = get<int64_t>(ResultSetUtils::GetValFromColumn(
122 PhotoColumn::PHOTO_THUMBNAIL_READY, resultSet, GetDataType(PhotoColumn::PHOTO_THUMBNAIL_READY)));
123 assetChangeInfo.displayName_ = get<string>(ResultSetUtils::GetValFromColumn(PhotoColumn::MEDIA_NAME, resultSet,
124 GetDataType(PhotoColumn::MEDIA_NAME)));
125 assetChangeInfo.path_ = get<string>(ResultSetUtils::GetValFromColumn(PhotoColumn::MEDIA_FILE_PATH, resultSet,
126 GetDataType(PhotoColumn::MEDIA_FILE_PATH)));
127 assetChangeInfo.dirty_ = get<int32_t>(ResultSetUtils::GetValFromColumn(
128 PhotoColumn::PHOTO_DIRTY, resultSet, GetDataType(PhotoColumn::PHOTO_DIRTY)));
129
130 assetChangeInfo.uri_ = MediaFileUtils::GetUriByExtrConditions(PhotoColumn::PHOTO_URI_PREFIX,
131 to_string(assetChangeInfo.fileId_), MediaFileUtils::GetExtraUri(assetChangeInfo.displayName_,
132 assetChangeInfo.path_));
133 if (assetChangeInfo.ownerAlbumId_ > 0) {
134 assetChangeInfo.ownerAlbumUri_ = MediaFileUtils::GetUriByExtrConditions(PhotoAlbumColumns::ALBUM_URI_PREFIX,
135 to_string(assetChangeInfo.ownerAlbumId_));
136 }
137 assetChangeInfo.position_ = get<int32_t>(ResultSetUtils::GetValFromColumn(
138 PhotoColumn::PHOTO_POSITION, resultSet, GetDataType(PhotoColumn::PHOTO_POSITION)));
139 assetChangeInfo.size_ = get<int64_t>(ResultSetUtils::GetValFromColumn(
140 PhotoColumn::MEDIA_SIZE, resultSet, GetDataType(PhotoColumn::MEDIA_SIZE)));
141 assetChangeInfos.push_back(assetChangeInfo);
142 }
143 return assetChangeInfos;
144 }
145
GetDataType(const std::string & column)146 ResultSetDataType PhotoAssetChangeInfo::GetDataType(const std::string &column)
147 {
148 auto const &item = photoAssetCloumnTypes_.find(column);
149 if (item == photoAssetCloumnTypes_.end()) {
150 return TYPE_NULL;
151 }
152 return item->second;
153 }
154
ToString(bool isDetail) const155 string PhotoAssetChangeInfo::ToString(bool isDetail) const
156 {
157 stringstream ss;
158 if (isDetail) {
159 ss << "fileId_: " << fileId_ << ", ownerAlbumId_: " << ownerAlbumId_ << ", uri_: ";
160 ss << MediaFileUtils::DesensitizeUri(uri_);
161 ss << ", dateDay_: " << dateDay_ << ", ownerAlbumUri_: " << ownerAlbumUri_ << ", isFavorite_: " << isFavorite_;
162 ss << ", mediaType_: " << mediaType_;
163 ss << ", isHidden_: " << isHidden_ << ", dateTrashedMs_: " << dateTrashedMs_;
164 ss << ", strongAssociation_: " << strongAssociation_;
165 ss << ", thumbnailVisible_: " << thumbnailVisible_ << ", dateAddedMs_: " << dateAddedMs_;
166 ss << ", dateTakenMs_: " << dateTakenMs_ << ", subType_: " << subType_;
167 ss << ", syncStatus_: " << syncStatus_ << ", cleanFlag_: " << cleanFlag_;
168 ss << ", timePending_: " << timePending_ << ", isTemp_: " << isTemp_;
169 ss << ", burstCoverLevel_: " << burstCoverLevel_;
170 ss << ", hiddenTime_: " << hiddenTime_ << ", thumbnailReady_: " << thumbnailReady_;
171 ss << ", displayName_: " << MediaFileUtils::DesensitizePath(displayName_);
172 ss << ", path_: " << MediaFileUtils::DesensitizePath(path_) << ", dirty_: " << dirty_;
173 ss << ", position_: " <<position_ << ", size_: " << size_;
174 } else {
175 ss << "fileId_: " << fileId_ << ", ownerAlbumId_: " << ownerAlbumId_;
176 }
177 return ss.str();
178 }
179
Marshalling(Parcel & parcel) const180 bool PhotoAssetChangeInfo::Marshalling(Parcel &parcel) const
181 {
182 return Marshalling(parcel, false);
183 }
184
Marshalling(Parcel & parcel,bool isSystem) const185 bool PhotoAssetChangeInfo::Marshalling(Parcel &parcel, bool isSystem) const
186 {
187 bool isValid = fileId_ != INVALID_INT32_VALUE;
188 bool ret = parcel.WriteBool(isValid);
189 if (ret && !isValid) {
190 return ret;
191 }
192 ret = ret && parcel.WriteString(uri_);
193 ret = ret && parcel.WriteInt32(mediaType_);
194 ret = ret && parcel.WriteString(ownerAlbumUri_);
195 ret = ret && parcel.WriteBool(isSystem);
196 ret = ret && parcel.WriteInt32(fileId_);
197 if (isSystem) {
198 ret = ret && parcel.WriteString(dateDay_);
199 ret = ret && parcel.WriteBool(isFavorite_);
200 ret = ret && parcel.WriteBool(isHidden_);
201 ret = ret && parcel.WriteInt32(strongAssociation_);
202 ret = ret && parcel.WriteInt32(thumbnailVisible_);
203 ret = ret && parcel.WriteInt64(dateTrashedMs_);
204 ret = ret && parcel.WriteInt64(dateAddedMs_);
205 ret = ret && parcel.WriteInt64(dateTakenMs_);
206 ret = ret && parcel.WriteInt32(ownerAlbumId_);
207 ret = ret && parcel.WriteInt32(position_);
208 ret = ret && parcel.WriteString(displayName_);
209 ret = ret && parcel.WriteInt64(size_);
210 }
211 return ret;
212 }
213
ReadFromParcel(Parcel & parcel)214 bool PhotoAssetChangeInfo::ReadFromParcel(Parcel &parcel)
215 {
216 bool isValid = false;
217 bool ret = parcel.ReadBool(isValid);
218 if (ret && !isValid) {
219 return ret;
220 }
221 ret = ret && parcel.ReadString(uri_);
222 ret = ret && parcel.ReadInt32(mediaType_);
223 ret = ret && parcel.ReadString(ownerAlbumUri_);
224 ret = ret && parcel.ReadBool(isSystem_);
225 ret = ret && parcel.ReadInt32(fileId_);
226 if (isSystem_) {
227 ret = ret && parcel.ReadString(dateDay_);
228 ret = ret && parcel.ReadBool(isFavorite_);
229 ret = ret && parcel.ReadBool(isHidden_);
230 ret = ret && parcel.ReadInt32(strongAssociation_);
231 ret = ret && parcel.ReadInt32(thumbnailVisible_);
232 ret = ret && parcel.ReadInt64(dateTrashedMs_);
233 ret = ret && parcel.ReadInt64(dateAddedMs_);
234 ret = ret && parcel.ReadInt64(dateTakenMs_);
235 ret = ret && parcel.ReadInt32(ownerAlbumId_);
236 ret = ret && parcel.ReadInt32(position_);
237 ret = ret && parcel.ReadString(displayName_);
238 ret = ret && parcel.ReadInt64(size_);
239 }
240 return true;
241 }
242
Unmarshalling(Parcel & parcel)243 shared_ptr<PhotoAssetChangeInfo> PhotoAssetChangeInfo::Unmarshalling(Parcel &parcel)
244 {
245 shared_ptr<PhotoAssetChangeInfo> assetChangeInfo = make_shared<PhotoAssetChangeInfo>();
246 if (assetChangeInfo->ReadFromParcel(parcel)) {
247 return assetChangeInfo;
248 }
249 return nullptr;
250 }
251
operator =(const PhotoAssetChangeInfo & info)252 PhotoAssetChangeInfo& PhotoAssetChangeInfo::operator=(const PhotoAssetChangeInfo &info)
253 {
254 if (this != &info) {
255 fileId_ = info.fileId_;
256 dateDay_ = info.dateDay_;
257 isFavorite_ = info.isFavorite_;
258 mediaType_ = info.mediaType_;
259 isHidden_ = info.isHidden_;
260 dateTrashedMs_ = info.dateTrashedMs_;
261 strongAssociation_ = info.strongAssociation_;
262 thumbnailVisible_ = info.thumbnailVisible_;
263 dateAddedMs_ = info.dateAddedMs_;
264 dateTakenMs_ = info.dateTakenMs_;
265 subType_ = info.subType_;
266 syncStatus_ = info.syncStatus_;
267 cleanFlag_ = info.cleanFlag_;
268 timePending_ = info.timePending_;
269 isTemp_ = info.isTemp_;
270 burstCoverLevel_ = info.burstCoverLevel_;
271 ownerAlbumId_ = info.ownerAlbumId_;
272 hiddenTime_ = info.hiddenTime_;
273 thumbnailReady_ = info.thumbnailReady_;
274 displayName_ = info.displayName_;
275 path_ = info.path_;
276 uri_ = info.uri_;
277 ownerAlbumUri_ = info.ownerAlbumUri_;
278 dirty_ = info.dirty_;
279 position_ = info.position_;
280 size_ = info.size_;
281 }
282 return *this;
283 }
operator ==(const PhotoAssetChangeInfo & info) const284 bool PhotoAssetChangeInfo::operator==(const PhotoAssetChangeInfo &info) const
285 {
286 return fileId_ == info.fileId_ &&
287 dateDay_ == info.dateDay_ &&
288 isFavorite_ == info.isFavorite_ &&
289 mediaType_ == info.mediaType_ &&
290 isHidden_ == info.isHidden_ &&
291 dateTrashedMs_ == info.dateTrashedMs_ &&
292 strongAssociation_ == info.strongAssociation_ &&
293 thumbnailVisible_ == info.thumbnailVisible_ &&
294 dateAddedMs_ == info.dateAddedMs_ &&
295 dateTakenMs_ == info.dateTakenMs_ &&
296 subType_ == info.subType_ &&
297 syncStatus_ == info.syncStatus_ &&
298 cleanFlag_ == info.cleanFlag_ &&
299 timePending_ == info.timePending_ &&
300 isTemp_ == info.isTemp_ &&
301 burstCoverLevel_ == info.burstCoverLevel_ &&
302 ownerAlbumId_ == info.ownerAlbumId_ &&
303 hiddenTime_ == info.hiddenTime_ &&
304 thumbnailReady_ == info.thumbnailReady_ &&
305 displayName_ == info.displayName_ &&
306 path_ == info.path_ &&
307 uri_ == info.uri_ &&
308 ownerAlbumUri_ == info.ownerAlbumUri_ &&
309 dirty_ == info.dirty_ &&
310 position_ == info.position_ &&
311 size_ == info.size_;
312 }
313
operator !=(const PhotoAssetChangeInfo & info) const314 bool PhotoAssetChangeInfo::operator!=(const PhotoAssetChangeInfo &info) const
315 {
316 return !((*this) == info);
317 }
318
319 template <typename T>
GetDiff(const T & value,const T & compareValue,const std::string & name,std::stringstream & ss)320 void GetDiff(const T &value, const T &compareValue, const std::string &name, std::stringstream &ss)
321 {
322 if (value != compareValue) {
323 ss << name << ": " << value << " -> " << compareValue << ", ";
324 }
325 }
326 #define GET_ASSET_DIFF(member) GetDiff(asset.member, compare.member, #member, ss)
GetAssetDiff(const PhotoAssetChangeInfo & asset,const PhotoAssetChangeInfo & compare)327 string PhotoAssetChangeInfo::GetAssetDiff(const PhotoAssetChangeInfo &asset, const PhotoAssetChangeInfo &compare)
328 {
329 stringstream ss;
330 if (asset.fileId_ != compare.fileId_) {
331 ss << "diff asset info fileId: " << asset.fileId_ << ", compare fileId: " << compare.fileId_;
332 return ss.str();
333 }
334 ss << "asset info fileId[" << asset.fileId_ << "]: ";
335 GET_ASSET_DIFF(uri_);
336 GET_ASSET_DIFF(dateDay_);
337 GET_ASSET_DIFF(ownerAlbumUri_);
338 GET_ASSET_DIFF(isFavorite_);
339 GET_ASSET_DIFF(mediaType_);
340 GET_ASSET_DIFF(isHidden_);
341 GET_ASSET_DIFF(dateTrashedMs_);
342 GET_ASSET_DIFF(strongAssociation_);
343 GET_ASSET_DIFF(thumbnailVisible_);
344 GET_ASSET_DIFF(dateAddedMs_);
345 GET_ASSET_DIFF(dateTakenMs_);
346 GET_ASSET_DIFF(subType_);
347 GET_ASSET_DIFF(syncStatus_);
348 GET_ASSET_DIFF(cleanFlag_);
349 GET_ASSET_DIFF(timePending_);
350 GET_ASSET_DIFF(isTemp_);
351 GET_ASSET_DIFF(burstCoverLevel_);
352 GET_ASSET_DIFF(ownerAlbumId_);
353 GET_ASSET_DIFF(hiddenTime_);
354 GET_ASSET_DIFF(dirty_);
355 GET_ASSET_DIFF(position_);
356 GET_ASSET_DIFF(size_);
357 if (asset.displayName_ != compare.displayName_) {
358 ss << "displayName_: " << MediaFileUtils::DesensitizePath(asset.displayName_) << " -> ";
359 ss << MediaFileUtils::DesensitizePath(compare.displayName_);
360 }
361
362 if (asset.path_ != compare.path_) {
363 ss << "path_: " << MediaFileUtils::DesensitizePath(asset.path_) << " -> ";
364 ss << MediaFileUtils::DesensitizePath(compare.path_);
365 }
366 return ss.str();
367 }
368
GetDataDiff(const PhotoAssetChangeInfo & compare)369 string PhotoAssetChangeInfo::GetDataDiff(const PhotoAssetChangeInfo &compare)
370 {
371 return GetAssetDiff(*this, compare);
372 }
373
Marshalling(Parcel & parcel) const374 bool PhotoAssetChangeData::Marshalling(Parcel &parcel) const
375 {
376 return Marshalling(parcel, false);
377 }
378
Marshalling(Parcel & parcel,bool isSystem) const379 bool PhotoAssetChangeData::Marshalling(Parcel &parcel, bool isSystem) const
380 {
381 bool ret = AccurateRefreshChangeData<PhotoAssetChangeInfo>::Marshalling(parcel, isSystem);
382 ret = ret && parcel.WriteBool(isContentChanged_);
383 if (isSystem) {
384 ret = ret && parcel.WriteInt32(thumbnailChangeStatus_);
385 }
386 return ret;
387 }
388
ReadFromParcel(Parcel & parcel)389 bool PhotoAssetChangeData::ReadFromParcel(Parcel &parcel)
390 {
391 bool ret = AccurateRefreshChangeData<PhotoAssetChangeInfo>::ReadFromParcel(parcel);
392 ret = ret && parcel.ReadBool(isContentChanged_);
393 if (isSystem_) {
394 ret = ret && parcel.ReadInt32(thumbnailChangeStatus_);
395 }
396 return ret;
397 }
398
Unmarshalling(Parcel & parcel)399 shared_ptr<PhotoAssetChangeData> PhotoAssetChangeData::Unmarshalling(Parcel &parcel)
400 {
401 shared_ptr<PhotoAssetChangeData> assetChangeData = make_shared<PhotoAssetChangeData>();
402 if (assetChangeData->ReadFromParcel(parcel)) {
403 return assetChangeData;
404 }
405 return nullptr;
406 }
407
GetFileId()408 int32_t PhotoAssetChangeData::GetFileId()
409 {
410 return infoBeforeChange_.fileId_ != INVALID_INT32_VALUE ? infoBeforeChange_.fileId_ : infoAfterChange_.fileId_;
411 }
412
413 } // namespace Media
414 } // namespace OHOS