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 #ifndef OHOS_MEDIALIBRARY_ALBUM_ACCURATE_REFRESH_MANAGER_H 17 #define OHOS_MEDIALIBRARY_ALBUM_ACCURATE_REFRESH_MANAGER_H 18 19 #include <mutex> 20 #include <unordered_map> 21 #include <sstream> 22 23 #include "accurate_common_data.h" 24 25 namespace OHOS { 26 namespace Media::AccurateRefresh { 27 #define EXPORT __attribute__ ((visibility ("default"))) 28 29 struct AlbumRefreshTimestamp { 30 int64_t start_ = INVALID_INT64_VALUE; 31 int64_t end_ = INVALID_INT64_VALUE; AlbumRefreshTimestampAlbumRefreshTimestamp32 AlbumRefreshTimestamp(int64_t start, int64_t end) : start_(start), end_(end) {} AlbumRefreshTimestampAlbumRefreshTimestamp33 AlbumRefreshTimestamp(int64_t start) : start_(start), end_(INVALID_INT64_VALUE) {} AlbumRefreshTimestampAlbumRefreshTimestamp34 AlbumRefreshTimestamp() : start_(INVALID_INT64_VALUE), end_(INVALID_INT64_VALUE) {} ToStringAlbumRefreshTimestamp35 std::string ToString() const 36 { 37 std::stringstream ss; 38 ss << "[" << start_ << ", " << end_ << "]"; 39 return ss.str(); 40 } 41 }; 42 43 enum AssetRefreshAlbumAction { 44 IGNORE, 45 ACCURATE_REFRESH, 46 FORCE_REFRESH 47 }; 48 49 class EXPORT AlbumAccurateRefreshManager { 50 public: GetInstance()51 static AlbumAccurateRefreshManager& GetInstance() 52 { 53 static AlbumAccurateRefreshManager instance; 54 return instance; 55 } 56 bool IsAlbumAccurateRefresh(int32_t albumId, bool isHidden); 57 void RemoveAccurateRefreshAlbum(int32_t albumId, bool isHidden); 58 void Clear(); 59 void SetRefreshTimestamp(int32_t albumId, bool isHidden, const AlbumRefreshTimestamp ×tamp); 60 AlbumRefreshTimestamp GetRefreshTimestamp(int32_t albumId, bool isHidden); 61 bool IsRefreshTimestampMatch(int32_t albumId, bool isHidden, AlbumRefreshTimestamp compareTimestamp); 62 AssetRefreshAlbumAction GetRefreshAction(AlbumRefreshTimestamp albumTimestamp, 63 AlbumRefreshTimestamp compareTimestamp); 64 int64_t GetCurrentRefreshTag(); 65 void SetForceRefresh(bool isForceRefresh, std::string reason); 66 67 private: AlbumAccurateRefreshManager()68 AlbumAccurateRefreshManager() {} ~AlbumAccurateRefreshManager()69 ~AlbumAccurateRefreshManager() {} 70 AlbumAccurateRefreshManager(const AlbumAccurateRefreshManager&) = delete; 71 AlbumAccurateRefreshManager& operator=(const AlbumAccurateRefreshManager&) = delete; 72 73 public: 74 std::mutex albumRefreshMutex_; 75 76 private: 77 std::unordered_map<int32_t, AlbumRefreshTimestamp> accurateRefreshAlbums_; 78 std::unordered_map<int32_t, AlbumRefreshTimestamp> accurateRefreshHiddenAlbums_; 79 bool isForceRefresh_ = false; 80 int64_t refreshTag_ = 0; 81 }; 82 83 class AlbumRefreshTimestampRecord { 84 public: AlbumRefreshTimestampRecord(int32_t albumId,bool isHidden)85 AlbumRefreshTimestampRecord(int32_t albumId, bool isHidden) 86 { 87 albumId_ = albumId; 88 isHidden_ = isHidden; 89 start_ = AlbumAccurateRefreshManager::GetInstance().GetCurrentRefreshTag(); 90 } 91 ~AlbumRefreshTimestampRecord()92 ~AlbumRefreshTimestampRecord() 93 { 94 // 异常情况未执行RefreshAlbumEnd,清除对应的albumId 95 if (!isRecord) { 96 AlbumAccurateRefreshManager::GetInstance().RemoveAccurateRefreshAlbum(albumId_, isHidden_); 97 } 98 } 99 ClearRecord()100 void ClearRecord() 101 { 102 isRecord = true; 103 } 104 RefreshAlbumEnd()105 void RefreshAlbumEnd() 106 { 107 AlbumRefreshTimestamp timestamp(start_, AlbumAccurateRefreshManager::GetInstance().GetCurrentRefreshTag()); 108 AlbumAccurateRefreshManager::GetInstance().SetRefreshTimestamp(albumId_, isHidden_, timestamp); 109 isRecord = true; 110 } 111 112 private: 113 int32_t albumId_; 114 bool isHidden_; 115 bool isRecord = false; 116 int64_t start_ = 0; 117 }; 118 119 } // namespace Media::AccurateRefresh 120 } // namespace OHOS 121 122 #endif