mirror of
https://github.com/openharmony/multimedia_ringtone_library.git
synced 2026-07-01 22:44:06 -04:00
支持多用户自定义铃声克隆
Change-Id: I878499a1b519b6ab7635f4e8ee5e42cdc638a804 Signed-off-by: caochuan <caochuan@huawei.com>
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user