* Copyright (c) 2025 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define MLOG_TAG "AccurateRefresh::AnalysisAlbumDataManager"
#include "analysis_album_data_manager.h"
#include "accurate_debug_log.h"
#include "medialibrary_unistore_manager.h"
#include "medialibrary_data_manager_utils.h"
#include "medialibrary_tracer.h"
#include "media_file_utils.h"
#include "vision_column.h"
using namespace std;
using namespace OHOS::NativeRdb;
namespace OHOS {
namespace Media {
namespace AccurateRefresh {
int32_t AnalysisAlbumDataManager::UpdateModifiedDatas()
{
return ACCURATE_REFRESH_RET_OK;
}
int32_t AnalysisAlbumDataManager::PostProcessModifiedDatas(const std::vector<int32_t> &keys)
{
MediaLibraryTracer tracer;
tracer.Start("AnalysisAlbumDataManager::PostProcessModifiedDatas");
for (auto &key : keys) {
auto item = changeDatas_.find(key);
if (item == changeDatas_.end()) {
MEDIA_WARN_LOG("no data, albumId[%{public}d].", key);
continue;
}
auto &before = item->second.infoBeforeChange_;
auto &after = item->second.infoAfterChange_;
if (before.coverUri_ != after.coverUri_) {
after.isCoverChange_ = true;
}
}
return ACCURATE_REFRESH_RET_OK;
}
vector<int32_t> AnalysisAlbumDataManager::GetInitKeys()
{
stringstream ss;
ss << "GetInitKeys:";
vector<int32_t> albumIds;
for (auto &changeData : changeDatas_) {
albumIds.push_back(changeData.first);
ss << " " << changeData.first;
}
ACCURATE_DEBUG("%{public}s", ss.str().c_str());
return albumIds;
}
int32_t AnalysisAlbumDataManager::GetChangeInfoKey(const AlbumChangeInfo &changeInfo)
{
return changeInfo.albumId_;
}
bool AnalysisAlbumDataManager::CheckIsForRecheck()
{
return isForRecheck_ || CheckIsExceed();
}
vector<AlbumChangeInfo> AnalysisAlbumDataManager::GetInfoByKeys(const vector<int32_t> &albumIds)
{
vector<AlbumChangeInfo> albumInfos;
if (albumIds.empty()) {
MEDIA_WARN_LOG("AlbumIds input is empty.");
return albumInfos;
}
vector<string> albumIdStrs;
for (auto const &albumId : albumIds) {
albumIdStrs.push_back(to_string(static_cast<int> (albumId)));
}
vector<AlbumChangeInfo> albumIdInfos;
RdbPredicates predicates(ANALYSIS_ALBUM_TABLE);
predicates.In(PhotoAlbumColumns::ALBUM_ID, albumIdStrs);
albumInfos = GetInfosByPredicates(predicates);
return albumInfos;
}
vector<AlbumChangeInfo> AnalysisAlbumDataManager::GetInfosByPredicates(const AbsRdbPredicates &predicates)
{
MediaLibraryTracer tracer;
tracer.Start("AnalysisAlbumDataManager::GetInfosByPredicates");
shared_ptr<ResultSet> resultSet;
if (CanTransOperate()) {
resultSet = trans_->QueryByStep(predicates, AlbumChangeInfo::GetAnalysisAlbumInfoColumns());
} else {
auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, vector<AlbumChangeInfo>(), "rdbStore null");
resultSet = rdbStore->QueryByStep(predicates, AlbumChangeInfo::GetAnalysisAlbumInfoColumns());
}
CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, vector<AlbumChangeInfo>(), "resultSet null");
auto albumInfos = GetInfosByResult(resultSet);
resultSet->Close();
return albumInfos;
}
vector<AlbumChangeInfo> AnalysisAlbumDataManager::GetInfosByResult(const shared_ptr<ResultSet> &resultSet)
{
return AlbumChangeInfo::GetAnalysisAlbumInfoFromResult(resultSet);
}
void AnalysisAlbumDataManager::ClearChangeDatas()
{
this->changeDatas_.clear();
}
int32_t AnalysisAlbumDataManager::SetAlbumIdsByPredicates(const AbsRdbPredicates &predicates)
{
return NativeRdb::E_OK;
}
int32_t AnalysisAlbumDataManager::SetAlbumIdsBySql(const std::string &sql,
const std::vector<ValueObject> &bindArgs)
{
return NativeRdb::E_OK;
}
int32_t AnalysisAlbumDataManager::SetAlbumIdsByFileds(const std::vector<int32_t> &fileIds)
{
return NativeRdb::E_OK;
}
bool AnalysisAlbumDataManager::CheckIsExceed(bool isLengthChanged)
{
if (!isLengthChanged) {
return isExceed_;
}
if (isExceed_) {
return true;
}
isExceed_ = this->changeDatas_.size() >= MAX_DATA_LENGTH;
if (isExceed_) {
this->changeDatas_.clear();
}
return isExceed_;
};
bool AnalysisAlbumDataManager::CheckIsExceed(const AbsRdbPredicates &predicates, bool isLengthChanged)
{
return CheckIsExceed(isLengthChanged);
};
bool AnalysisAlbumDataManager::CheckIsExceed(const string &sql,
const vector<ValueObject> &bindArgs, bool isLengthChanged)
{
return CheckIsExceed(isLengthChanged);
};
bool AnalysisAlbumDataManager::CheckIsExceed(size_t length)
{
if (length >= MAX_DATA_LENGTH) {
isExceed_ = true;
this->changeDatas_.clear();
}
return isExceed_;
}
bool AnalysisAlbumDataManager::CheckIsExceed(const vector<int32_t> &keys)
{
if (keys.size() >= MAX_DATA_LENGTH) {
isExceed_ = true;
this->changeDatas_.clear();
}
return isExceed_;
}
}
}
}