• 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::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