• 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::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 &timestamp)
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