支持多用户自定义铃声克隆

Change-Id: I878499a1b519b6ab7635f4e8ee5e42cdc638a804
Signed-off-by: caochuan <caochuan@huawei.com>
This commit is contained in:
caochuan
2025-12-16 10:08:32 +08:00
parent bc0e1ac8a0
commit ef2004bffe
10 changed files with 79 additions and 52 deletions
@@ -25,11 +25,14 @@
namespace OHOS {
namespace Media {
const std::string RINGTONE_EXTERNAL_BASE_PATH = "/storage/emulated/0";
const std::string RINGTONE_EXTERNAL_MUSIC_PATH = RINGTONE_EXTERNAL_BASE_PATH + "/Music";
const std::string FILE_MANAGER_BASE_PATH = "/storage/media/local/files/Docs";
const std::string FILE_MANAGER_UPDATE_BACKUP_PATH = FILE_MANAGER_BASE_PATH + "/UpdateBackup";
const std::string RINGTONE_EXTERNAL_BASE_PATH = "/storage/emulated/";
const std::string RINGTONE_EXTERNAL_SUB_DIR_MUSIC = "Music/";
const std::string FILE_MANAGER_BASE_PATH = "/storage/media/";
const std::string FILE_MANAGER_SUB_DIR_DOCS = "local/files/Docs/";
const std::string FILE_MANAGER_SUB_DIR_UPDATEBACKUP = FILE_MANAGER_SUB_DIR_DOCS + "UpdateBackup/";
constexpr int STORAGE_MANAGER_MANAGER_ID = 5003;
static constexpr uint64_t MAX_TONE_FILE_SIZE = 200 * 1024 * 1024;
class CustomisedToneProcessor {
public:
@@ -56,7 +56,7 @@ protected:
bool NeedCommitSetting(const std::string &typeColumn, const std::string &sourceColumn,
int type, int allSetType);
void SetNotRingtone(const std::string &typeColumn, const std::string &sourceColumn, int32_t simCard);
void UpdateSettingTable(const SimcardSettingAsset &asset);
void UpdateSettingTable(const SimcardSettingAsset &asset, bool forceUpdate = false);
private:
void CheckUpdateVibrateSetting(const FileInfo &info);
std::string QuerySingleColumn(const std::string &dataColumn,
@@ -41,6 +41,7 @@
#endif
#include "ringtone_restore_base.h"
#include "iservice_registry.h"
#include "ringtone_restore_db_utils.h"
namespace OHOS {
namespace Media {
@@ -153,47 +154,35 @@ int32_t CustomisedToneProcessor::GetCustomisedAudioPath(DualFwkConf &dualFwkConf
std::string CustomisedToneProcessor::ConvertCustomisedAudioPath(const std::string &ringtonePath)
{
if (ringtonePath.empty()) {
RINGTONE_ERR_LOG("customised audio path is empty");
return "";
}
CHECK_AND_RETURN_RET_LOG(!ringtonePath.empty(), "", "customised audio path is empty");
auto pos = ringtonePath.find(RINGTONE_EXTERNAL_BASE_PATH);
CHECK_AND_RETURN_RET_LOG(pos != std::string::npos, "",
"customised audio file not in the directory: %{public}s", RINGTONE_EXTERNAL_BASE_PATH.c_str());
std::string::size_type pos = ringtonePath.find(RINGTONE_EXTERNAL_BASE_PATH);
if (pos == std::string::npos) {
RINGTONE_ERR_LOG("customised audio file not in the directory: %{public}s", RINGTONE_EXTERNAL_BASE_PATH.c_str());
return "";
}
std::filesystem::path userSubPath = ringtonePath.substr(RINGTONE_EXTERNAL_BASE_PATH.length());
userSubPath = userSubPath.relative_path();
auto iter = userSubPath.begin();
CHECK_AND_RETURN_RET_LOG(iter != userSubPath.end(), "",
"invalid subpath: %{public}s", userSubPath.c_str());
std::filesystem::path subPath = RingtoneUtils::IsNumber(*iter) ?
std::filesystem::relative(userSubPath, *iter) : userSubPath;
bool isMusicPath = subPath.string().find(RINGTONE_EXTERNAL_SUB_DIR_MUSIC) != std::string::npos;
std::filesystem::path fileMgrBasePath = FILE_MANAGER_BASE_PATH;
std::filesystem::path searchPath1 = fileMgrBasePath / FILE_MANAGER_SUB_DIR_DOCS;
std::filesystem::path searchPath2 = fileMgrBasePath / FILE_MANAGER_SUB_DIR_UPDATEBACKUP;
std::string strSearchPath1 = (searchPath1 / subPath).lexically_normal().string();
std::string strSearchPath2 = (searchPath2 / subPath).lexically_normal().string();
RINGTONE_INFO_LOG("searchPath1:%{public}s, searchPath2:%{public}s",
strSearchPath1.c_str(), strSearchPath2.c_str());
std::string absPath = ringtonePath.substr(pos + RINGTONE_EXTERNAL_BASE_PATH.length());
bool isMusicPath = ringtonePath.find(RINGTONE_EXTERNAL_MUSIC_PATH) != std::string::npos;
std::string fileMgrAudioPath = "";
std::string tmpPath;
if (isMusicPath && PathToRealPath(FILE_MANAGER_UPDATE_BACKUP_PATH + absPath, tmpPath)) {
fileMgrAudioPath = FILE_MANAGER_UPDATE_BACKUP_PATH + absPath;
RINGTONE_INFO_LOG("convert %{public}s to %{public}s", ringtonePath.c_str(), fileMgrAudioPath.c_str());
return fileMgrAudioPath;
}
if (!isMusicPath && PathToRealPath(FILE_MANAGER_BASE_PATH + absPath, tmpPath)) {
fileMgrAudioPath = FILE_MANAGER_BASE_PATH + absPath;
RINGTONE_INFO_LOG("convert %{public}s to %{public}s", ringtonePath.c_str(), fileMgrAudioPath.c_str());
return fileMgrAudioPath;
}
if (!isMusicPath && PathToRealPath(FILE_MANAGER_UPDATE_BACKUP_PATH + absPath, tmpPath)) {
fileMgrAudioPath = FILE_MANAGER_UPDATE_BACKUP_PATH + absPath;
RINGTONE_INFO_LOG("convert %{public}s to %{public}s", ringtonePath.c_str(), fileMgrAudioPath.c_str());
return fileMgrAudioPath;
}
if (isMusicPath && PathToRealPath(FILE_MANAGER_BASE_PATH + absPath, tmpPath)) {
fileMgrAudioPath = FILE_MANAGER_BASE_PATH + absPath;
RINGTONE_INFO_LOG("convert %{public}s to %{public}s", ringtonePath.c_str(), fileMgrAudioPath.c_str());
return fileMgrAudioPath;
}
RINGTONE_DEBUG_LOG("No rule can convert ringtonePath: %{public}s", ringtonePath.c_str());
return fileMgrAudioPath;
CHECK_AND_RETURN_RET(!(isMusicPath && PathToRealPath(strSearchPath2, tmpPath)), strSearchPath2);
CHECK_AND_RETURN_RET(!(!isMusicPath && PathToRealPath(strSearchPath1, tmpPath)), strSearchPath1);
CHECK_AND_RETURN_RET(!(!isMusicPath && PathToRealPath(strSearchPath2, tmpPath)), strSearchPath2);
CHECK_AND_RETURN_RET(!(isMusicPath && PathToRealPath(strSearchPath1, tmpPath)), strSearchPath1);
RINGTONE_INFO_LOG("No rule can convert ringtonePath: %{public}s", ringtonePath.c_str());
return "";
}
int32_t CustomisedToneProcessor::BuildFileInfo(const std::string &dualFilePath, int32_t toneType, int32_t ringtoneType,
@@ -244,7 +233,7 @@ std::string CustomisedToneProcessor::GetNewUri(int32_t toneType, const std::stri
CHECK_AND_RETURN_RET_LOG(manager_ != nullptr, newUri, "get media library manager failed");
std::string fileUri;
std::string filePath{oldUri};
if (mediaType == RINGTONE_MEDIA_TYPE_VIDEO) {
if (mediaType == RINGTONE_MEDIA_TYPE_VIDEO && ext == RINGTONE_CONTAINER_TYPE_VIDEO_MP4) {
auto newUris = manager_->GetUrisByOldUris({oldUri});
fileUri = newUris.count(oldUri) == 0 ? oldUri : newUris[oldUri];
if (fileUri != oldUri) {
@@ -256,6 +245,11 @@ std::string CustomisedToneProcessor::GetNewUri(int32_t toneType, const std::stri
if (!filePath.empty() && filePath != oldUri) {
int32_t fd = manager_->OpenAsset(fileUri, RINGTONE_FILEMODE_READONLY);
CHECK_AND_RETURN_RET_LOG(fd > 0, newUri, "get file fd failed");
if (!RingtoneFileUtils::CheckFileSize(fd, MAX_TONE_FILE_SIZE)) {
RINGTONE_ERR_LOG("file size exceed limit");
manager_->CloseAsset(fileUri, fd);
return newUri;
}
std::string target = RingtoneRestoreBase::GetRestoreDir(toneType) +
"/" + RingtoneFileUtils::GetFileNameFromPath(oldUri);
RingtoneFileUtils::DeleteFile(target);
@@ -241,7 +241,7 @@ std::string DualFwkSoundSetting::ExtractFileName(const std::string &input)
}
auto pos = input.find(DUALFWK_CONF_VIBRATE_MODE_STD);
if (pos != std::string::npos) {
if (pos == std::string::npos) {
return ret;
}
@@ -517,7 +517,7 @@ void RingtoneRestoreBase::SetNotRingtone(const string &columnType, const string
RINGTONE_INFO_LOG("update both end changeRows = %{public}d", changeRows);
}
void RingtoneRestoreBase::UpdateSettingTable(const SimcardSettingAsset &asset)
void RingtoneRestoreBase::UpdateSettingTable(const SimcardSettingAsset &asset, bool forceUpdate)
{
CHECK_AND_RETURN_LOG(localRdb_ != nullptr, "localRdb_ is null");
int32_t changeRows = 0;
@@ -535,6 +535,9 @@ void RingtoneRestoreBase::UpdateSettingTable(const SimcardSettingAsset &asset)
whereArgs.push_back(to_string(asset.GetRingtoneType()));
absRdbPredicates.SetWhereClause(whereClause);
absRdbPredicates.SetWhereArgs(whereArgs);
if (!forceUpdate) {
absRdbPredicates.IsNull(SIMCARD_SETTING_COLUMN_VIBRATE_MODE);
}
localRdb_->Update(changeRows, valuesBucket, absRdbPredicates);
RINGTONE_INFO_LOG("update end changeRows = %{public}d", changeRows);
}
@@ -79,6 +79,7 @@ public:
EXPORT static std::string GetFileExtension(const std::string &path);
EXPORT static void RemoveRingtoneFolder(const std::string &path);
EXPORT static bool IsTargetExtension(const std::string &filePath);
EXPORT static bool CheckFileSize(int32_t fd, uint64_t maxFileSize);
};
} // namespace Media
} // namespace OHOS
@@ -515,6 +515,15 @@ int32_t RingtoneFileUtils::CopyFileFromFd(int32_t srcFd, const std::string &newP
return E_OK;
}
bool RingtoneFileUtils::CheckFileSize(int32_t fd, uint64_t maxFileSize)
{
CHECK_AND_RETURN_RET_LOG(fd > 0, false, "invalid fd");
struct stat stat_buf;
CHECK_AND_RETURN_RET_LOG(fstat(fd, &stat_buf) == 0, false, "get fd stat failed");
return static_cast<uint64_t>(stat_buf.st_size) <= maxFileSize;
}
int64_t RingtoneFileUtils::Timespec2Millisecond(const struct timespec &time)
{
return time.tv_sec * MSEC_TO_SEC + time.tv_nsec / MSEC_TO_NSEC;
@@ -41,11 +41,11 @@ namespace Media {
const string TEST_BACKUP_PATH = "/data/test/backup";
const string TEST_BACKUP_DATA = "/data/local/tmp/test/Adara.ogg";
const std::string TEST_RINGTONE_EXTERNAL_BASE_PATH = "/storage/emulated/0";
const std::string TEST_RINGTONE_EXTERNAL_MUSIC_PATH = TEST_RINGTONE_EXTERNAL_BASE_PATH + "/Music";
const std::string TEST_FILE_MANAGER_BASE_PATH = "/storage/media/local/files/Docs";
const std::string TEST_FILE_MANAGER_MUSIC_PATH = TEST_FILE_MANAGER_BASE_PATH + "/Music";
const std::string TEST_FILE_MANAGER_UPDATE_BACKUP_PATH = TEST_FILE_MANAGER_BASE_PATH + "/UpdateBackup";
const std::string TEST_FILE_MANAGER_UPDATE_BACKUP_MUSIC_PATH = TEST_FILE_MANAGER_UPDATE_BACKUP_PATH + "/Music";
const std::string TEST_RINGTONE_EXTERNAL_MUSIC_PATH = TEST_RINGTONE_EXTERNAL_BASE_PATH + "/Music/";
const std::string TEST_FILE_MANAGER_BASE_PATH = "/storage/media/local/files/Docs/";
const std::string TEST_FILE_MANAGER_MUSIC_PATH = TEST_FILE_MANAGER_BASE_PATH + "Music/";
const std::string TEST_FILE_MANAGER_UPDATE_BACKUP_PATH = TEST_FILE_MANAGER_BASE_PATH + "UpdateBackup/";
const std::string TEST_FILE_MANAGER_UPDATE_BACKUP_MUSIC_PATH = TEST_FILE_MANAGER_UPDATE_BACKUP_PATH + "Music/";
unique_ptr<CustomisedToneProcessor> g_customisedToneProcess = nullptr;
@@ -137,6 +137,10 @@ HWTEST_F(CustomisedToneProcessorTest, customised_tone_processor_003, TestSize.Le
ret1 = g_customisedToneProcess->ConvertCustomisedAudioPath(ringtonePath);
EXPECT_EQ(ret1, TEST_FILE_MANAGER_UPDATE_BACKUP_MUSIC_PATH);
EXPECT_EQ(g_customisedToneProcess->ConvertCustomisedAudioPath(""), "");
EXPECT_EQ(g_customisedToneProcess->ConvertCustomisedAudioPath(TEST_BACKUP_PATH), "");
EXPECT_EQ(g_customisedToneProcess->ConvertCustomisedAudioPath(RINGTONE_EXTERNAL_BASE_PATH), "");
RINGTONE_INFO_LOG("customised_tone_processor_003::End");
}
@@ -330,7 +330,7 @@ HWTEST_F(RingtoneDualFwkRestoreTest, ringtone_VibrateSettingClone_test_0001, Tes
auto settings = dualSetting->GetSettings();
DualFwkSettingItem item;
for (auto &setting : settings) {
if (item.toneSetting.settingType == TONE_SETTING_TYPE_ALARM) {
if (setting.toneSetting.settingType == TONE_SETTING_TYPE_ALARM) {
item = setting;
}
}
@@ -472,5 +472,18 @@ HWTEST_F(RingtoneFileUtilsTest, ringtoneUtils_CopyFileFromFd_Test_001, TestSize.
RingtoneFileUtils::DeleteFile(newPath);
}
HWTEST_F(RingtoneFileUtilsTest, ringtoneUtils_CheckFileSize_Test_001, TestSize.Level1)
{
uint64_t maxFileSize = 1024 * 1024 * 100;
string oldPath = "/data/local/tmp/test/check_file_size_utils1.ogg";
EXPECT_EQ(RingtoneFileUtils::CheckFileSize(-1, maxFileSize), false);
EXPECT_EQ(RingtoneFileUtils::CreateFile(oldPath), E_SUCCESS);
int32_t fd = RingtoneFileUtils::OpenFile(oldPath, RINGTONE_FILEMODE_READONLY);
EXPECT_GT(fd, 0);
EXPECT_EQ(RingtoneFileUtils::CheckFileSize(fd, maxFileSize), true);
RingtoneFileUtils::DeleteFile(oldPath);
}
} // namespace Media
} // namespace OHOS