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::AlbumAccurateRefreshManager"
17
18 #include <cstdint>
19 #include "accurate_debug_log.h"
20 #include "album_accurate_refresh_manager.h"
21 #include "media_file_utils.h"
22
23 namespace OHOS {
24 namespace Media::AccurateRefresh {
25
IsAlbumAccurateRefresh(int32_t albumId,bool isHidden)26 bool AlbumAccurateRefreshManager::IsAlbumAccurateRefresh(int32_t albumId, bool isHidden)
27 {
28 std::lock_guard<std::mutex> lock(albumRefreshMutex_);
29 if (isForceRefresh_) {
30 return false;
31 }
32 if (isHidden) {
33 return accurateRefreshHiddenAlbums_.find(albumId) != accurateRefreshHiddenAlbums_.end();
34 } else {
35 return accurateRefreshAlbums_.find(albumId) != accurateRefreshAlbums_.end();
36 }
37 }
38
RemoveAccurateRefreshAlbum(int32_t albumId,bool isHidden)39 void AlbumAccurateRefreshManager::RemoveAccurateRefreshAlbum(int32_t albumId, bool isHidden)
40 {
41 std::lock_guard<std::mutex> lock(albumRefreshMutex_);
42 if (isHidden) {
43 accurateRefreshAlbums_.erase(albumId);
44 } else {
45 accurateRefreshHiddenAlbums_.erase(albumId);
46 }
47
48 ACCURATE_DEBUG("remove album[%{public}d], hidden[%{public}d]", albumId, isHidden);
49 }
50
Clear()51 void AlbumAccurateRefreshManager::Clear()
52 {
53 std::lock_guard<std::mutex> lock(albumRefreshMutex_);
54 accurateRefreshAlbums_.clear();
55 accurateRefreshHiddenAlbums_.clear();
56 MEDIA_INFO_LOG("clear");
57 }
58
SetRefreshTimestamp(int32_t albumId,bool isHidden,const AlbumRefreshTimestamp & timestamp)59 void AlbumAccurateRefreshManager::SetRefreshTimestamp(int32_t albumId, bool isHidden,
60 const AlbumRefreshTimestamp ×tamp)
61 {
62 ACCURATE_DEBUG("albumId[%{public}d, %{public}d] refresh timestamp: %{public}s", albumId, isHidden,
63 timestamp.ToString().c_str());
64 std::lock_guard<std::mutex> lock(albumRefreshMutex_);
65 if (isHidden) {
66 accurateRefreshHiddenAlbums_.insert_or_assign(albumId, timestamp);
67 } else {
68 accurateRefreshAlbums_.insert_or_assign(albumId, timestamp);
69 }
70 }
71
GetRefreshTimestamp(int32_t albumId,bool isHidden)72 AlbumRefreshTimestamp AlbumAccurateRefreshManager::GetRefreshTimestamp(int32_t albumId, bool isHidden)
73 {
74 std::lock_guard<std::mutex> lock(albumRefreshMutex_);
75
76 if (isHidden) {
77 auto iter = accurateRefreshHiddenAlbums_.find(albumId);
78 if (iter == accurateRefreshHiddenAlbums_.end()) {
79 ACCURATE_DEBUG("albumId[%{public}d] no refresh hidden timestamp", albumId);
80 return AlbumRefreshTimestamp();
81 }
82 return iter->second;
83 } else {
84 auto iter = accurateRefreshAlbums_.find(albumId);
85 if (iter == accurateRefreshAlbums_.end()) {
86 ACCURATE_DEBUG("albumId[%{public}d] no refresh timestamp", albumId);
87 return AlbumRefreshTimestamp();
88 }
89 return iter->second;
90 }
91 }
92
GetCurrentRefreshTag()93 int64_t AlbumAccurateRefreshManager::GetCurrentRefreshTag()
94 {
95 std::lock_guard<std::mutex> lock(albumRefreshMutex_);
96 refreshTag_++;
97 if (refreshTag_ < 0) {
98 refreshTag_ = 0;
99 accurateRefreshAlbums_.clear();
100 accurateRefreshHiddenAlbums_.clear();
101 MEDIA_INFO_LOG("reset refreshTag_");
102 }
103 return refreshTag_;
104 }
105
IsRefreshTimestampMatch(int32_t albumId,bool isHidden,AlbumRefreshTimestamp compareTimestamp)106 bool AlbumAccurateRefreshManager::IsRefreshTimestampMatch(int32_t albumId, bool isHidden,
107 AlbumRefreshTimestamp compareTimestamp)
108 {
109 auto albumTimestamp = GetRefreshTimestamp(albumId, isHidden);
110 return albumTimestamp.start_ == compareTimestamp.start_ && albumTimestamp.end_ == compareTimestamp.end_;
111 }
112
GetRefreshAction(AlbumRefreshTimestamp albumTimestamp,AlbumRefreshTimestamp compareTimestamp)113 AssetRefreshAlbumAction AlbumAccurateRefreshManager::GetRefreshAction(AlbumRefreshTimestamp albumTimestamp,
114 AlbumRefreshTimestamp compareTimestamp)
115 {
116 if (albumTimestamp.start_ == INVALID_INT64_VALUE || albumTimestamp.end_ == INVALID_INT64_VALUE) {
117 return FORCE_REFRESH;
118 }
119 if (albumTimestamp.start_ > compareTimestamp.end_) {
120 return IGNORE;
121 }
122 if (albumTimestamp.end_ < compareTimestamp.start_) {
123 return ACCURATE_REFRESH;
124 }
125 return FORCE_REFRESH;
126 }
127
SetForceRefresh(bool isForceRefresh,std::string reason)128 void AlbumAccurateRefreshManager::SetForceRefresh(bool isForceRefresh, std::string reason)
129 {
130 MEDIA_WARN_LOG("force refresh[%{public}d], reason: %{public}s", isForceRefresh, reason.c_str());
131 std::lock_guard<std::mutex> lock(albumRefreshMutex_);
132 isForceRefresh_ = isForceRefresh;
133 }
134
135 } // namespace Media::AccurateRefresh
136 } // namespace OHOS