• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 #include "system_sound_manager_impl.h"
17 
18 #include <fstream>
19 #include <nativetoken_kit.h>
20 #include "access_token.h"
21 #include "accesstoken_kit.h"
22 #include "ipc_skeleton.h"
23 #include "tokenid_kit.h"
24 #include "token_setproc.h"
25 #include "ringtone_proxy_uri.h"
26 
27 #include "config_policy_utils.h"
28 #include "file_ex.h"
29 #include "nlohmann/json.hpp"
30 
31 #include "system_sound_log.h"
32 #include "media_errors.h"
33 #include "ringtone_player_impl.h"
34 #include "vibrate_type.h"
35 #include "os_account_manager.h"
36 #include "system_tone_player_impl.h"
37 #include "parameter.h"
38 #include "string_ex.h"
39 #include "parameters.h"
40 
41 using namespace std;
42 using namespace nlohmann;
43 using namespace OHOS::AbilityRuntime;
44 using namespace OHOS::DataShare;
45 
46 namespace {
47 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_AUDIO_NAPI, "SystemSoundManagerImpl"};
48 }
49 
50 namespace OHOS {
51 namespace Media {
52 const std::string RING_TONE = "ring_tone";
53 const std::string SYSTEM_TONE = "system_tone";
54 const std::string DEFAULT_SYSTEM_SOUND_PATH = "resource/media/audio/";
55 const std::string DEFAULT_RINGTONE_URI_JSON = "ringtone_incall.json";
56 const std::string DEFAULT_RINGTONE_PATH = "ringtones/";
57 const std::string DEFAULT_SYSTEM_TONE_URI_JSON = "ringtone_sms-notification.json";
58 const std::string DEFAULT_SYSTEM_TONE_PATH = "notifications/";
59 const std::string EXT_SERVICE_AUDIO = "const.mulitimedia.service_audio";
60 const int STORAGE_MANAGER_MANAGER_ID = 5003;
61 const int UNSUPPORTED_ERROR = -5;
62 #ifdef SUPPORT_VIBRATOR
63 const int OPERATION_ERROR = -4;
64 #endif
65 const int IO_ERROR = -3;
66 const int TYPEERROR = -2;
67 const int ERROR = -1;
68 const int SUCCESS = 0;
69 const int32_t EXT_PROXY_UID = 1000;
70 const int32_t EXT_PROXY_SID = 66849;
71 const int32_t CMD_SET_EXT_RINGTONE_URI = 6;
72 
73 enum ExtToneType : int32_t {
74     EXT_TYPE_RINGTONE_ONE = 1,
75     EXT_TYPE_NOTIFICATION = 2,
76     EXT_TYPE_ALARMTONE = 4,
77     EXT_TYPE_RINGTONE_TWO = 8,
78     EXT_TYPE_MESSAGETONE_ONE = 16,
79     EXT_TYPE_MESSAGETONE_TWO = 32,
80 };
81 
82 // tone haptics default setting
83 static const char PARAM_HAPTICS_SETTING_RINGTONE_CARD_ONE[] = "const.multimedia.haptics_ringtone_sim_card_0_haptics";
84 static const char PARAM_HAPTICS_SETTING_RINGTONE_CARD_TWO[] = "const.multimedia.haptics_ringtone_sim_card_1_haptics";
85 static const char PARAM_HAPTICS_SETTING_SHOT_CARD_ONE[] = "const.multimedia.haptics_system_tone_sim_card_0_haptics";
86 static const char PARAM_HAPTICS_SETTING_SHOT_CARD_TWO[] = "const.multimedia.haptics_system_tone_sim_card_1_haptics";
87 static const char PARAM_HAPTICS_SETTING_NOTIFICATIONTONE[] = "const.multimedia.notification_tone_haptics";
88 static const int32_t SYSPARA_SIZE = 128;
89 constexpr int32_t RETRY_TIME_S = 5;
90 constexpr int64_t SLEEP_TIME_S = 1;
91 
92 std::shared_ptr<SystemSoundManager> SystemSoundManagerFactory::systemSoundManager_ = nullptr;
93 std::mutex SystemSoundManagerFactory::systemSoundManagerMutex_;
94 std::unordered_map<RingtoneType, RingToneType> ringtoneTypeMap_;
95 std::unordered_map<int32_t, ToneCustomizedType> sourceTypeMap_;
96 std::unordered_map<SystemToneType, int32_t> systemTypeMap_;
97 std::unordered_map<SystemToneType, ShotToneType> shotToneTypeMap_;
98 std::unordered_map<ToneHapticsMode, VibratePlayMode> hapticsModeMap_;
99 std::unordered_map<ToneHapticsType, std::pair<int32_t, int32_t>> hapticsTypeWhereArgsMap_;
100 std::unordered_map<int32_t, std::unordered_map<HapticsStyle, int32_t>> hapticsStyleMap_;
101 std::unordered_map<RingtoneType, DefaultSystemToneType> defaultoneTypeMap_;
102 std::unordered_map<SystemToneType, int32_t> defaultsystemTypeMap_;
103 Uri RINGTONEURI(RINGTONE_PATH_URI);
104 Uri VIBRATEURI(VIBRATE_PATH_URI);
105 Uri SIMCARDSETTINGURI(SIMCARD_SETTING_PATH_URI);
106 Uri RINGTONEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES);
107 Uri VIBRATEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_VIBATE_FILES);
108 Uri SIMCARDSETTINGURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_SIMCARD_SETTING);
109 vector<string> COLUMNS = {{RINGTONE_COLUMN_TONE_ID}, {RINGTONE_COLUMN_DATA}, {RINGTONE_COLUMN_DISPLAY_NAME},
110     {RINGTONE_COLUMN_TITLE}, {RINGTONE_COLUMN_TONE_TYPE}, {RINGTONE_COLUMN_SOURCE_TYPE},
111     {RINGTONE_COLUMN_SHOT_TONE_TYPE}, {RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE}, {RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE},
112     {RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE}, {RINGTONE_COLUMN_RING_TONE_TYPE},
113     {RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE}, {RINGTONE_COLUMN_ALARM_TONE_TYPE},
114     {RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE}};
115 vector<string> JOIN_COLUMNS = {{RINGTONE_TABLE + "." + RINGTONE_COLUMN_TONE_ID}, {RINGTONE_COLUMN_DATA},
116     {RINGTONE_TABLE + "." + RINGTONE_COLUMN_DISPLAY_NAME}, {RINGTONE_COLUMN_TITLE},
117     {RINGTONE_COLUMN_TONE_TYPE}, {RINGTONE_COLUMN_SOURCE_TYPE}, {RINGTONE_COLUMN_SHOT_TONE_TYPE},
118     {RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE}, {RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE},
119     {RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE}, {RINGTONE_TABLE + "." + RINGTONE_COLUMN_RING_TONE_TYPE},
120     {RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE}, {RINGTONE_COLUMN_ALARM_TONE_TYPE},
121     {RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE}};
122 vector<string> SETTING_TABLE_COLUMNS = {{SIMCARD_SETTING_COLUMN_MODE}, {SIMCARD_SETTING_COLUMN_TONE_FILE},
123     {SIMCARD_SETTING_COLUMN_RINGTONE_TYPE}, {SIMCARD_SETTING_COLUMN_VIBRATE_FILE},
124     {SIMCARD_SETTING_COLUMN_VIBRATE_MODE}, {SIMCARD_SETTING_COLUMN_RING_MODE}};
125 vector<string> VIBRATE_TABLE_COLUMNS = {{VIBRATE_COLUMN_VIBRATE_ID}, {VIBRATE_COLUMN_DATA}, {VIBRATE_COLUMN_SIZE},
126     {VIBRATE_COLUMN_DISPLAY_NAME}, {VIBRATE_COLUMN_TITLE}, {VIBRATE_COLUMN_DISPLAY_LANGUAGE},
127     {VIBRATE_COLUMN_VIBRATE_TYPE}, {VIBRATE_COLUMN_SOURCE_TYPE}, {VIBRATE_COLUMN_DATE_ADDED},
128     {VIBRATE_COLUMN_DATE_MODIFIED}, {VIBRATE_COLUMN_DATE_TAKEN}, {VIBRATE_COLUMN_PLAY_MODE}};
129 std::vector<std::string> RINGTONETYPE = {{RINGTONE_CONTAINER_TYPE_MP3}, {RINGTONE_CONTAINER_TYPE_OGG},
130     {RINGTONE_CONTAINER_TYPE_AC3}, {RINGTONE_CONTAINER_TYPE_AAC}, {RINGTONE_CONTAINER_TYPE_FLAC},
131     {RINGTONE_CONTAINER_TYPE_WAV}};
132 
CreateSystemSoundManager()133 std::shared_ptr<SystemSoundManager> SystemSoundManagerFactory::CreateSystemSoundManager()
134 {
135     std::lock_guard<std::mutex> lock(systemSoundManagerMutex_);
136     if (systemSoundManager_ == nullptr) {
137         systemSoundManager_ = std::make_shared<SystemSoundManagerImpl>();
138     }
139     CHECK_AND_RETURN_RET_LOG(systemSoundManager_ != nullptr, nullptr, "Failed to create sound manager object");
140     return systemSoundManager_;
141 }
142 
GetCurrentUserId()143 static int32_t GetCurrentUserId()
144 {
145     std::vector<int32_t> ids;
146     int32_t currentuserId = -1;
147     ErrCode result;
148     int32_t retry = RETRY_TIME_S;
149     while (retry--) {
150         result = AccountSA::OsAccountManager::QueryActiveOsAccountIds(ids);
151         if (result == ERR_OK && !ids.empty()) {
152             currentuserId = ids[0];
153             MEDIA_LOGD("current userId is :%{public}d", currentuserId);
154             break;
155         }
156 
157         // sleep and wait for 1 millisecond
158         sleep(SLEEP_TIME_S);
159     }
160     if (result != ERR_OK || ids.empty()) {
161         MEDIA_LOGW("current userId is empty");
162     }
163     return currentuserId;
164 }
165 
CreateDataShareHelperUri(int32_t systemAbilityId)166 static shared_ptr<DataShare::DataShareHelper> CreateDataShareHelperUri(int32_t systemAbilityId)
167 {
168     MEDIA_LOGI("CreateDataShareHelperUri : Enter CreateDataShareHelperUri()");
169     CreateOptions options;
170     options.enabled_ = true;
171     int32_t useId = GetCurrentUserId();
172     std::string uri = RINGTONE_LIBRARY_PROXY_URI + "?Proxy=true" + "&user=" + std::to_string(useId);
173     MEDIA_LOGI("uri : %{public}s", uri.c_str());
174     return DataShare::DataShareHelper::Creator(uri, options);
175 }
176 
CreateDataShareHelper(int32_t systemAbilityId)177 static shared_ptr<DataShare::DataShareHelper> CreateDataShareHelper(int32_t systemAbilityId)
178 {
179     MEDIA_LOGI("CreateDataShareHelper : Enter CreateDataShareHelper()");
180     auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
181     if (saManager == nullptr) {
182         MEDIA_LOGE("Get system ability manager failed.");
183         return nullptr;
184     }
185     auto remoteObj = saManager->GetSystemAbility(systemAbilityId);
186     if (remoteObj == nullptr) {
187         MEDIA_LOGE("Get system ability:[%{public}d] failed.", systemAbilityId);
188         return nullptr;
189     }
190     return DataShare::DataShareHelper::Creator(remoteObj, RINGTONE_URI);
191 }
192 
SystemSoundManagerImpl()193 SystemSoundManagerImpl::SystemSoundManagerImpl()
194 {
195     InitDefaultUriMap();
196     InitRingerMode();
197     InitMap();
198     InitDefaultToneHapticsMap();
199 }
200 
~SystemSoundManagerImpl()201 SystemSoundManagerImpl::~SystemSoundManagerImpl()
202 {
203     if (audioGroupManager_ != nullptr) {
204         (void)audioGroupManager_->UnsetRingerModeCallback(getpid(), ringerModeCallback_);
205         ringerModeCallback_ = nullptr;
206         audioGroupManager_ = nullptr;
207     }
208 }
209 
InitMap(void)210 void SystemSoundManagerImpl::InitMap(void)
211 {
212     ringtoneTypeMap_[RINGTONE_TYPE_SIM_CARD_0] = RING_TONE_TYPE_SIM_CARD_1;
213     ringtoneTypeMap_[RINGTONE_TYPE_SIM_CARD_1] = RING_TONE_TYPE_SIM_CARD_2;
214     sourceTypeMap_[SOURCE_TYPE_PRESET] = PRE_INSTALLED;
215     sourceTypeMap_[SOURCE_TYPE_CUSTOMISED] = CUSTOMISED;
216     systemTypeMap_[SYSTEM_TONE_TYPE_SIM_CARD_0] = SHOT_TONE_TYPE_SIM_CARD_1;
217     systemTypeMap_[SYSTEM_TONE_TYPE_SIM_CARD_1] = SHOT_TONE_TYPE_SIM_CARD_2;
218     systemTypeMap_[SYSTEM_TONE_TYPE_NOTIFICATION] = NOTIFICATION_TONE_TYPE;
219     shotToneTypeMap_[SYSTEM_TONE_TYPE_SIM_CARD_0] = SHOT_TONE_TYPE_SIM_CARD_1;
220     shotToneTypeMap_[SYSTEM_TONE_TYPE_SIM_CARD_1] = SHOT_TONE_TYPE_SIM_CARD_2;
221     defaultoneTypeMap_[RINGTONE_TYPE_SIM_CARD_0] = DEFAULT_RING_TYPE_SIM_CARD_1;
222     defaultoneTypeMap_[RINGTONE_TYPE_SIM_CARD_1] = DEFAULT_RING_TYPE_SIM_CARD_2;
223     defaultsystemTypeMap_[SYSTEM_TONE_TYPE_SIM_CARD_0] = DEFAULT_SHOT_TYPE_SIM_CARD_1;
224     defaultsystemTypeMap_[SYSTEM_TONE_TYPE_SIM_CARD_1] = DEFAULT_SHOT_TYPE_SIM_CARD_2;
225     defaultsystemTypeMap_[SYSTEM_TONE_TYPE_NOTIFICATION] = DEFAULT_NOTIFICATION_TYPE;
226     hapticsModeMap_[NONE] = VIBRATE_PLAYMODE_NONE;
227     hapticsModeMap_[SYNC] = VIBRATE_PLAYMODE_SYNC;
228     hapticsModeMap_[NON_SYNC] = VIBRATE_PLAYMODE_CLASSIC;
229     hapticsTypeWhereArgsMap_ = {
230         {ToneHapticsType::CALL_SIM_CARD_0, {RING_TONE_TYPE_SIM_CARD_1, TONE_SETTING_TYPE_RINGTONE}},
231         {ToneHapticsType::CALL_SIM_CARD_1, {RING_TONE_TYPE_SIM_CARD_2, TONE_SETTING_TYPE_RINGTONE}},
232         {ToneHapticsType::TEXT_MESSAGE_SIM_CARD_0, {RING_TONE_TYPE_SIM_CARD_1, TONE_SETTING_TYPE_SHOT}},
233         {ToneHapticsType::TEXT_MESSAGE_SIM_CARD_1, {RING_TONE_TYPE_SIM_CARD_2, TONE_SETTING_TYPE_SHOT}},
234         {ToneHapticsType::NOTIFICATION, {RING_TONE_TYPE_SIM_CARD_BOTH, TONE_SETTING_TYPE_NOTIFICATION}},
235     };
236     hapticsStyleMap_[VIBRATE_TYPE_STANDARD] = {
237         {HAPTICS_STYLE_GENTLE, VIBRATE_TYPE_GENTLE},
238     };
239     hapticsStyleMap_[VIBRATE_TYPE_SALARM] = {
240         {HAPTICS_STYLE_GENTLE, VIBRATE_TYPE_GALARM},
241     };
242     hapticsStyleMap_[VIBRATE_TYPE_SRINGTONE] = {
243         {HAPTICS_STYLE_GENTLE, VIBRATE_TYPE_GRINGTONE},
244     };
245     hapticsStyleMap_[VIBRATE_TYPE_SNOTIFICATION] = {
246         {HAPTICS_STYLE_GENTLE, VIBRATE_TYPE_GNOTIFICATION},
247     };
248 }
249 
InitRingerMode(void)250 void SystemSoundManagerImpl::InitRingerMode(void)
251 {
252     audioGroupManager_ = AudioStandard::AudioSystemManager::GetInstance()->
253         GetGroupManager(AudioStandard::DEFAULT_VOLUME_GROUP_ID);
254     if (audioGroupManager_ == nullptr) {
255         MEDIA_LOGE("InitRingerMode: audioGroupManager_ is nullptr");
256         return;
257     }
258     ringerMode_ = audioGroupManager_->GetRingerMode();
259 
260     ringerModeCallback_ = std::make_shared<RingerModeCallbackImpl>(*this);
261     audioGroupManager_->SetRingerModeCallback(getpid(), ringerModeCallback_);
262 }
263 
IsRingtoneTypeValid(RingtoneType ringtongType)264 bool SystemSoundManagerImpl::IsRingtoneTypeValid(RingtoneType ringtongType)
265 {
266     switch (ringtongType) {
267         case RINGTONE_TYPE_SIM_CARD_0:
268         case RINGTONE_TYPE_SIM_CARD_1:
269             return true;
270         default:
271             MEDIA_LOGE("IsRingtoneTypeValid: ringtongType %{public}d is unavailable", ringtongType);
272             return false;
273     }
274 }
275 
IsSystemToneTypeValid(SystemToneType systemToneType)276 bool SystemSoundManagerImpl::IsSystemToneTypeValid(SystemToneType systemToneType)
277 {
278     switch (systemToneType) {
279         case SYSTEM_TONE_TYPE_SIM_CARD_0:
280         case SYSTEM_TONE_TYPE_SIM_CARD_1:
281         case SYSTEM_TONE_TYPE_NOTIFICATION:
282             return true;
283         default:
284             MEDIA_LOGE("IsSystemToneTypeValid: systemToneType %{public}d is unavailable", systemToneType);
285             return false;
286     }
287 }
288 
IsSystemToneType(const unique_ptr<RingtoneAsset> & ringtoneAsset,const SystemToneType & systemToneType)289 bool SystemSoundManagerImpl::IsSystemToneType(const unique_ptr<RingtoneAsset> &ringtoneAsset,
290     const SystemToneType &systemToneType)
291 {
292     CHECK_AND_RETURN_RET_LOG(ringtoneAsset != nullptr, false, "Invalid ringtone asset.");
293     return (systemToneType == SYSTEM_TONE_TYPE_NOTIFICATION ?
294         TONE_TYPE_NOTIFICATION != ringtoneAsset->GetToneType() :
295         TONE_TYPE_SHOT != ringtoneAsset->GetToneType());
296 }
297 
IsToneHapticsTypeValid(ToneHapticsType toneHapticsType)298 bool SystemSoundManagerImpl::IsToneHapticsTypeValid(ToneHapticsType toneHapticsType)
299 {
300     switch (toneHapticsType) {
301         case ToneHapticsType::CALL_SIM_CARD_0 :
302         case ToneHapticsType::CALL_SIM_CARD_1 :
303         case ToneHapticsType::TEXT_MESSAGE_SIM_CARD_0 :
304         case ToneHapticsType::TEXT_MESSAGE_SIM_CARD_1 :
305         case ToneHapticsType::NOTIFICATION :
306             return true;
307         default:
308             MEDIA_LOGE("IsToneHapticsTypeValid: toneHapticsType %{public}d is unavailable", toneHapticsType);
309             return false;
310     }
311 }
312 
InitDefaultUriMap()313 void SystemSoundManagerImpl::InitDefaultUriMap()
314 {
315     systemSoundPath_ = GetFullPath(DEFAULT_SYSTEM_SOUND_PATH);
316 
317     std::string ringtoneJsonPath = systemSoundPath_ + DEFAULT_RINGTONE_URI_JSON;
318     InitDefaultRingtoneUriMap(ringtoneJsonPath);
319 
320     std::string systemToneJsonPath = systemSoundPath_ + DEFAULT_SYSTEM_TONE_URI_JSON;
321     InitDefaultSystemToneUriMap(systemToneJsonPath);
322 }
323 
InitDefaultRingtoneUriMap(const std::string & ringtoneJsonPath)324 void SystemSoundManagerImpl::InitDefaultRingtoneUriMap(const std::string &ringtoneJsonPath)
325 {
326     std::lock_guard<std::mutex> lock(uriMutex_);
327 
328     std::string jsonValue = GetJsonValue(ringtoneJsonPath);
329     nlohmann::json ringtoneJson = json::parse(jsonValue, nullptr, false);
330     if (ringtoneJson.is_discarded()) {
331         MEDIA_LOGE("ringtoneJson parsing is false !");
332         return;
333     }
334     if (ringtoneJson.contains("preset_ringtone_sim1") && ringtoneJson["preset_ringtone_sim1"].is_string()) {
335         std::string defaultRingtoneName = ringtoneJson["preset_ringtone_sim1"];
336         defaultRingtoneUriMap_[RINGTONE_TYPE_SIM_CARD_0] =
337             systemSoundPath_ + DEFAULT_RINGTONE_PATH + defaultRingtoneName + ".ogg";
338         MEDIA_LOGI("preset_ringtone_sim1 is [%{public}s]", defaultRingtoneUriMap_[RINGTONE_TYPE_SIM_CARD_0].c_str());
339     } else {
340         defaultRingtoneUriMap_[RINGTONE_TYPE_SIM_CARD_0] = "";
341         MEDIA_LOGW("InitDefaultRingtoneUriMap: failed to load uri of preset_ringtone_sim1");
342     }
343     if (ringtoneJson.contains("preset_ringtone_sim2") && ringtoneJson["preset_ringtone_sim2"].is_string()) {
344         std::string defaultRingtoneName = ringtoneJson["preset_ringtone_sim2"];
345         defaultRingtoneUriMap_[RINGTONE_TYPE_SIM_CARD_1] =
346             systemSoundPath_ + DEFAULT_RINGTONE_PATH + defaultRingtoneName + ".ogg";
347         MEDIA_LOGI("preset_ringtone_sim1 is [%{public}s]", defaultRingtoneUriMap_[RINGTONE_TYPE_SIM_CARD_1].c_str());
348     } else {
349         defaultRingtoneUriMap_[RINGTONE_TYPE_SIM_CARD_1] = "";
350         MEDIA_LOGW("InitDefaultRingtoneUriMap: failed to load uri of preset_ringtone_sim2");
351     }
352 }
353 
GetDefaultRingtoneUri(RingtoneType ringtoneType)354 std::string SystemSoundManagerImpl::GetDefaultRingtoneUri(RingtoneType ringtoneType)
355 {
356     std::lock_guard<std::mutex> lock(uriMutex_);
357     if (defaultRingtoneUriMap_.count(ringtoneType) == 0) {
358         MEDIA_LOGE("Failed to GetDefaultRingtoneUri: invalid ringtone type %{public}d", ringtoneType);
359         return "";
360     }
361     return defaultRingtoneUriMap_[ringtoneType];
362 }
363 
GetDefaultSystemToneUri(SystemToneType systemToneType)364 std::string SystemSoundManagerImpl::GetDefaultSystemToneUri(SystemToneType systemToneType)
365 {
366     std::lock_guard<std::mutex> lock(uriMutex_);
367     if (defaultSystemToneUriMap_.count(systemToneType) == 0) {
368         MEDIA_LOGE("Failed to GetDefaultSystemToneUri: invalid system tone type %{public}d", systemToneType);
369         return "";
370     }
371     return defaultSystemToneUriMap_[systemToneType];
372 }
373 
InitDefaultSystemToneUriMap(const std::string & systemToneJsonPath)374 void SystemSoundManagerImpl::InitDefaultSystemToneUriMap(const std::string &systemToneJsonPath)
375 {
376     std::lock_guard<std::mutex> lock(uriMutex_);
377 
378     std::string jsonValue = GetJsonValue(systemToneJsonPath);
379     nlohmann::json systemToneJson = json::parse(jsonValue, nullptr, false);
380     if (systemToneJson.is_discarded()) {
381         MEDIA_LOGE("systemToneJson parsing is false !");
382         return;
383     }
384     if (systemToneJson.contains("preset_ringtone_sms") && systemToneJson["preset_ringtone_sms"].is_string()) {
385         std::string defaultSystemToneName = systemToneJson["preset_ringtone_sms"];
386         defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_SIM_CARD_0] =
387             systemSoundPath_ + DEFAULT_SYSTEM_TONE_PATH + defaultSystemToneName + ".ogg";
388         defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_SIM_CARD_1] =
389             systemSoundPath_ + DEFAULT_SYSTEM_TONE_PATH + defaultSystemToneName + ".ogg";
390         MEDIA_LOGI("preset_ringtone_sms is [%{public}s]",
391             defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_SIM_CARD_0].c_str());
392     } else {
393         defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_SIM_CARD_0] = "";
394         defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_SIM_CARD_1] = "";
395         MEDIA_LOGW("InitDefaultSystemToneUriMap: failed to load uri of preset_ringtone_sms");
396     }
397     if (systemToneJson.contains("preset_ringtone_notification") &&
398         systemToneJson["preset_ringtone_notification"].is_string()) {
399         std::string defaultSystemToneName = systemToneJson["preset_ringtone_notification"];
400         defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_NOTIFICATION] =
401             systemSoundPath_ + DEFAULT_SYSTEM_TONE_PATH + defaultSystemToneName + ".ogg";
402         MEDIA_LOGI("preset_ringtone_notification is [%{public}s]",
403             defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_NOTIFICATION].c_str());
404     } else {
405         defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_NOTIFICATION] = "";
406         MEDIA_LOGW("InitDefaultSystemToneUriMap: failed to load uri of preset_ringtone_notification");
407     }
408 }
409 
ReadDefaultToneHaptics(const char * paramName,ToneHapticsType toneHapticsType)410 void SystemSoundManagerImpl::ReadDefaultToneHaptics(const char *paramName, ToneHapticsType toneHapticsType)
411 {
412     char paramValue[SYSPARA_SIZE] = {0};
413     GetParameter(paramName, "", paramValue, SYSPARA_SIZE);
414     if (strcmp(paramValue, "")) {
415         defaultToneHapticsUriMap_.insert(make_pair(toneHapticsType, string(paramValue)));
416         MEDIA_LOGI("ReadDefaultToneHaptics: tone [%{public}d] haptics is [%{public}s]", toneHapticsType, paramValue);
417     } else {
418         MEDIA_LOGW("ReadDefaultToneHaptics: failed to load uri of [%{public}s]", paramName);
419     }
420 }
421 
InitDefaultToneHapticsMap()422 void SystemSoundManagerImpl::InitDefaultToneHapticsMap()
423 {
424     ReadDefaultToneHaptics(PARAM_HAPTICS_SETTING_RINGTONE_CARD_ONE, ToneHapticsType::CALL_SIM_CARD_0);
425     ReadDefaultToneHaptics(PARAM_HAPTICS_SETTING_RINGTONE_CARD_TWO, ToneHapticsType::CALL_SIM_CARD_1);
426     ReadDefaultToneHaptics(PARAM_HAPTICS_SETTING_SHOT_CARD_ONE, ToneHapticsType::TEXT_MESSAGE_SIM_CARD_0);
427     ReadDefaultToneHaptics(PARAM_HAPTICS_SETTING_SHOT_CARD_TWO, ToneHapticsType::TEXT_MESSAGE_SIM_CARD_1);
428     ReadDefaultToneHaptics(PARAM_HAPTICS_SETTING_NOTIFICATIONTONE, ToneHapticsType::NOTIFICATION);
429 }
430 
GetFullPath(const std::string & originalUri)431 std::string SystemSoundManagerImpl::GetFullPath(const std::string &originalUri)
432 {
433     char buf[MAX_PATH_LEN];
434     char *path = GetOneCfgFile(originalUri.c_str(), buf, MAX_PATH_LEN);
435     if (path == nullptr || *path == '\0') {
436         MEDIA_LOGE("GetOneCfgFile for %{public}s failed.", originalUri.c_str());
437         return "";
438     }
439     std::string filePath = path;
440     MEDIA_LOGI("GetFullPath for [%{public}s], result: [%{public}s]", originalUri.c_str(), filePath.c_str());
441     return filePath;
442 }
443 
GetJsonValue(const std::string & jsonPath)444 std::string SystemSoundManagerImpl::GetJsonValue(const std::string &jsonPath)
445 {
446     std::string jsonValue = "";
447     ifstream file(jsonPath.c_str());
448     if (!file.is_open()) {
449         MEDIA_LOGI("file not open! try open first ! ");
450         file.open(jsonPath.c_str(), ios::app);
451         if (!file.is_open()) {
452             MEDIA_LOGE("open file again fail !");
453             return "";
454         }
455     }
456     file.seekg(0, ios::end);
457 
458     const long maxFileLength = 32 * 1024 * 1024; // max size of the json file
459     const long fileLength = file.tellg();
460     if (fileLength > maxFileLength) {
461         MEDIA_LOGE("invalid file length(%{public}ld)!", fileLength);
462         return "";
463     }
464 
465     jsonValue.clear();
466     file.seekg(0, ios::beg);
467     copy(istreambuf_iterator<char>(file), istreambuf_iterator<char>(), back_inserter(jsonValue));
468     return jsonValue;
469 }
470 
WriteUriToDatabase(const std::string & key,const std::string & uri)471 int32_t SystemSoundManagerImpl::WriteUriToDatabase(const std::string &key, const std::string &uri)
472 {
473     int32_t result = AudioStandard::AudioSystemManager::GetInstance()->SetSystemSoundUri(key, uri);
474     MEDIA_LOGI("WriteUriToDatabase: key: %{public}s, uri: %{public}s, result: %{public}d",
475         key.c_str(), uri.c_str(), result);
476     return result;
477 }
478 
GetUriFromDatabase(const std::string & key)479 std::string SystemSoundManagerImpl::GetUriFromDatabase(const std::string &key)
480 {
481     std::string uri = AudioStandard::AudioSystemManager::GetInstance()->GetSystemSoundUri(key);
482 
483     MEDIA_LOGI("GetUriFromDatabase: key [%{public}s], uri [%{public}s]", key.c_str(), uri.c_str());
484     return uri;
485 }
486 
GetKeyForDatabase(const std::string & systemSoundType,int32_t type)487 std::string SystemSoundManagerImpl::GetKeyForDatabase(const std::string &systemSoundType, int32_t type)
488 {
489     if (systemSoundType == RING_TONE) {
490         switch (static_cast<RingtoneType>(type)) {
491             case RINGTONE_TYPE_SIM_CARD_0:
492                 return "ringtone_for_sim_card_0";
493             case RINGTONE_TYPE_SIM_CARD_1:
494                 return "ringtone_for_sim_card_1";
495             default:
496                 MEDIA_LOGE("GetKeyForDatabase: ringtoneType %{public}d is unavailable", type);
497                 return "";
498         }
499     } else if (systemSoundType == SYSTEM_TONE) {
500         switch (static_cast<SystemToneType>(type)) {
501             case SYSTEM_TONE_TYPE_SIM_CARD_0:
502                 return "system_tone_for_sim_card_0";
503             case SYSTEM_TONE_TYPE_SIM_CARD_1:
504                 return "system_tone_for_sim_card_1";
505             case SYSTEM_TONE_TYPE_NOTIFICATION:
506                 return "system_tone_for_notification";
507             default:
508                 MEDIA_LOGE("GetKeyForDatabase: systemToneType %{public}d is unavailable", type);
509                 return "";
510         }
511     } else {
512         MEDIA_LOGE("GetKeyForDatabase: systemSoundType %{public}s is unavailable", systemSoundType.c_str());
513         return "";
514     }
515 }
516 
UpdateRingtoneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const int32_t & toneId,RingtoneType ringtoneType,const int32_t & num)517 int32_t SystemSoundManagerImpl::UpdateRingtoneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
518     const int32_t &toneId, RingtoneType ringtoneType, const int32_t &num)
519 {
520     RingToneType type = RING_TONE_TYPE_SIM_CARD_1;
521     DataSharePredicates updateOnlyPredicates;
522     DataShareValuesBucket updateOnlyValuesBucket;
523     updateOnlyPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
524         RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
525     updateOnlyPredicates.SetWhereArgs({to_string(ringtoneTypeMap_[ringtoneType]),
526         to_string(SOURCE_TYPE_CUSTOMISED)});
527     updateOnlyValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_TYPE, RING_TONE_TYPE_NOT);
528     updateOnlyValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
529     dataShareHelper->Update(RINGTONEURI, updateOnlyPredicates, updateOnlyValuesBucket);
530 
531     DataSharePredicates updateBothPredicates;
532     DataShareValuesBucket updateBothValuesBucket;
533     if (ringtoneTypeMap_[ringtoneType] == RING_TONE_TYPE_SIM_CARD_1) {
534         type = RING_TONE_TYPE_SIM_CARD_2;
535     }
536     updateBothPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
537         RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
538     updateBothPredicates.SetWhereArgs({to_string(RING_TONE_TYPE_SIM_CARD_BOTH),
539         to_string(SOURCE_TYPE_CUSTOMISED)});
540     updateBothValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_TYPE, type);
541     dataShareHelper->Update(RINGTONEURI, updateBothPredicates, updateBothValuesBucket);
542 
543     DataSharePredicates updatePredicates;
544     DataShareValuesBucket updateValuesBucket;
545     if (((num == RING_TONE_TYPE_SIM_CARD_1 || num == RING_TONE_TYPE_SIM_CARD_BOTH) &&
546         (ringtoneTypeMap_[ringtoneType] == RING_TONE_TYPE_SIM_CARD_2)) ||
547         ((num == RING_TONE_TYPE_SIM_CARD_2 || num == RING_TONE_TYPE_SIM_CARD_BOTH) &&
548         (ringtoneTypeMap_[ringtoneType] == RING_TONE_TYPE_SIM_CARD_1))) {
549         type = RING_TONE_TYPE_SIM_CARD_BOTH;
550     } else {
551         type = ringtoneTypeMap_[ringtoneType];
552     }
553     updatePredicates.SetWhereClause(RINGTONE_COLUMN_TONE_ID + " = ? ");
554     updatePredicates.SetWhereArgs({to_string(toneId)});
555     updateValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_TYPE, type);
556     updateValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE, SOURCE_TYPE_CUSTOMISED);
557     return dataShareHelper->Update(RINGTONEURI, updatePredicates, updateValuesBucket);
558 }
559 
SetNoRingToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,RingtoneType ringtoneType)560 int32_t SystemSoundManagerImpl::SetNoRingToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
561     RingtoneType ringtoneType)
562 {
563     MEDIA_LOGI("Set no audio uri for system tone type %{public}d", ringtoneType);
564     int32_t result = 0;
565     // Removes the flag for the current system tone uri.
566     result += RemoveSourceTypeForRingTone(dataShareHelper, ringtoneType, SOURCE_TYPE_CUSTOMISED);
567     // Removes the flag for the preset system tone uri.
568     result += RemoveSourceTypeForRingTone(dataShareHelper, ringtoneType, SOURCE_TYPE_PRESET);
569     return result;
570 }
571 
RemoveSourceTypeForRingTone(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,RingtoneType ringtoneType,SourceType sourceType)572 int32_t SystemSoundManagerImpl::RemoveSourceTypeForRingTone(
573     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, RingtoneType ringtoneType, SourceType sourceType)
574 {
575     int32_t result = 0;
576     switch (ringtoneType) {
577         case RINGTONE_TYPE_SIM_CARD_0:
578         case RINGTONE_TYPE_SIM_CARD_1: {
579             // SIM_CARD_0 or SIM_CARD_1
580             DataSharePredicates updateOnlyPredicates;
581             DataShareValuesBucket updateOnlyValuesBucket;
582             updateOnlyPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
583                 RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
584             updateOnlyPredicates.SetWhereArgs({to_string(ringtoneTypeMap_[ringtoneType]), to_string(sourceType)});
585             updateOnlyValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_TYPE, RING_TONE_TYPE_NOT);
586             updateOnlyValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
587             result += dataShareHelper->Update(RINGTONEURI, updateOnlyPredicates, updateOnlyValuesBucket);
588             // both SIM_CARD_0 and SIM_CARD_1
589             DataSharePredicates updateBothPredicates;
590             DataShareValuesBucket updateBothValuesBucket;
591             RingToneType type = RING_TONE_TYPE_SIM_CARD_1;
592             if (ringtoneTypeMap_[ringtoneType] == RING_TONE_TYPE_SIM_CARD_1) {
593                 type = RING_TONE_TYPE_SIM_CARD_2;
594             }
595             updateBothPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
596                 RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
597             updateBothPredicates.SetWhereArgs({to_string(RING_TONE_TYPE_SIM_CARD_BOTH), to_string(sourceType)});
598             updateBothValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_TYPE, type);
599             result += dataShareHelper->Update(RINGTONEURI, updateBothPredicates, updateBothValuesBucket);
600             MEDIA_LOGI("The ring0 tone type [%{public}d] is invalid!", ringtoneType);
601             break;
602         }
603         default:
604             MEDIA_LOGE("The ring1 tone type [%{public}d] is invalid!", ringtoneType);
605             break;
606     }
607     return result;
608 }
609 
SetRingtoneUri(const shared_ptr<Context> & context,const string & uri,RingtoneType ringtoneType)610 int32_t SystemSoundManagerImpl::SetRingtoneUri(const shared_ptr<Context> &context, const string &uri,
611     RingtoneType ringtoneType)
612 {
613     std::lock_guard<std::mutex> lock(uriMutex_);
614     CHECK_AND_RETURN_RET_LOG(IsRingtoneTypeValid(ringtoneType), MSERR_INVALID_VAL, "Invalid ringtone type");
615 
616     MEDIA_LOGI("SetRingtoneUri: ringtoneType %{public}d, uri %{public}s", ringtoneType, uri.c_str());
617     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
618     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR, "Create dataShare failed, datashare or library error.");
619 
620     if (uri == NO_RING_SOUND) {
621         int32_t changedRows = SetNoRingToneUri(dataShareHelper, ringtoneType);
622         MEDIA_LOGI("SetNoRingToneUri result: changedRows %{public}d", changedRows);
623         dataShareHelper->Release();
624         return SUCCESS;
625     }
626 
627     DataShare::DatashareBusinessError businessError;
628     DataShare::DataSharePredicates queryPredicates;
629     DataShare::DataSharePredicates queryPredicatesByUri;
630     queryPredicatesByUri.EqualTo(RINGTONE_COLUMN_DATA, uri);
631     auto resultSetByUri = dataShareHelper->Query(RINGTONEURI, queryPredicatesByUri, COLUMNS, &businessError);
632     auto resultsByUri = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSetByUri));
633     unique_ptr<RingtoneAsset> ringtoneAssetByUri = resultsByUri->GetFirstObject();
634     if (ringtoneAssetByUri == nullptr) {
635         resultSetByUri == nullptr ? : resultSetByUri->Close();
636         dataShareHelper->Release();
637         MEDIA_LOGE("Failed to find the uri in ringtone library!");
638         return ERROR;
639     }
640     resultSetByUri == nullptr ? : resultSetByUri->Close();
641     queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, TONE_TYPE_RINGTONE);
642     auto resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
643     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
644     CHECK_AND_RETURN_RET_LOG(results != nullptr, ERROR, "query failed, ringtone library error.");
645     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
646     while ((ringtoneAsset != nullptr) && (uri != ringtoneAsset->GetPath())) {
647         ringtoneAsset = results->GetNextObject();
648     }
649     if (ringtoneAsset != nullptr) {
650         int32_t changedRows = UpdateRingtoneUri(dataShareHelper, ringtoneAsset->GetId(),
651             ringtoneType, ringtoneAsset->GetRingtoneType());
652         resultSet == nullptr ? : resultSet->Close();
653         dataShareHelper->Release();
654         SetExtRingtoneUri(uri, ringtoneAsset->GetTitle(), ringtoneType, TONE_TYPE_RINGTONE, changedRows);
655         return changedRows > 0 ? SUCCESS : ERROR;
656     }
657     resultSet == nullptr ? : resultSet->Close();
658     dataShareHelper->Release();
659     return TYPEERROR;
660 }
661 
GetRingtoneUriByType(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & type)662 std::string SystemSoundManagerImpl::GetRingtoneUriByType(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
663     const std::string &type)
664 {
665     int32_t errCode = 0;
666     int32_t result = 0;
667     std::string uri = "";
668     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, uri,
669         "Invalid dataShare, datashare or ringtone library error.");
670     DataShare::DatashareBusinessError businessError;
671     DataShare::DataSharePredicates queryPredicates;
672     queryPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
673         RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
674     queryPredicates.SetWhereArgs({type, to_string(SOURCE_TYPE_CUSTOMISED)});
675     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
676     errCode = businessError.GetCode();
677     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
678     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
679         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
680     MEDIA_LOGI("systemsoundmanagerimpl errCode:%{public}d, result :%{public}d ", errCode, result);
681     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
682         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
683         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, uri,
684             "Invalid dataShare, datashare or ringtone library error.");
685         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
686     }
687     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
688     CHECK_AND_RETURN_RET_LOG(results != nullptr, uri, "query failed, ringtone library error.");
689     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
690     if (ringtoneAsset != nullptr) {
691         uri = ringtoneAsset->GetPath();
692     }
693     resultSet == nullptr ? : resultSet->Close();
694     return uri;
695 }
696 
GetPresetRingToneUriByType(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & type)697 std::string SystemSoundManagerImpl::GetPresetRingToneUriByType(std::shared_ptr<DataShare::DataShareHelper>
698     dataShareHelper, const std::string &type)
699 {
700     std::string uri = "";
701     int32_t errCode = 0;
702     int32_t result = 0;
703     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, uri,
704         "Invalid dataShare, datashare or ringtone library error.");
705     DataShare::DatashareBusinessError businessError;
706     DataShare::DataSharePredicates queryPredicates;
707     queryPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
708         RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
709     queryPredicates.SetWhereArgs({type, to_string(SOURCE_TYPE_PRESET)});
710     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
711     errCode = businessError.GetCode();
712     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
713     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
714         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
715     MEDIA_LOGI("systemsoundmanagerimpl errCode:%{public}d, result :%{public}d ", errCode, result);
716     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
717         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
718         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, uri,
719             "Invalid dataShare, datashare or ringtone library error.");
720         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
721     }
722     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
723     CHECK_AND_RETURN_RET_LOG(results != nullptr, uri, "query failed, ringtone library error.");
724     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
725     if (ringtoneAsset != nullptr) {
726         uri = ringtoneAsset->GetPath();
727     }
728     resultSet == nullptr ? : resultSet->Close();
729     return uri;
730 }
731 
GetRingtoneUri(const shared_ptr<Context> & context,RingtoneType ringtoneType)732 std::string SystemSoundManagerImpl::GetRingtoneUri(const shared_ptr<Context> &context, RingtoneType ringtoneType)
733 {
734     CHECK_AND_RETURN_RET_LOG(IsRingtoneTypeValid(ringtoneType), "", "Invalid ringtone type");
735     std::string ringtoneUri = "";
736     MEDIA_LOGI("GetRingtoneUri: ringtoneType %{public}d", ringtoneType);
737     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
738     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, "",
739         "Create dataShare failed, datashare or ringtone library error.");
740     switch (ringtoneType) {
741         case RINGTONE_TYPE_SIM_CARD_0:
742         case RINGTONE_TYPE_SIM_CARD_1:
743             ringtoneUri = GetRingtoneUriByType(dataShareHelper, to_string(ringtoneTypeMap_[ringtoneType]));
744             if (ringtoneUri.empty()) {
745                 ringtoneUri = GetRingtoneUriByType(dataShareHelper, to_string(RING_TONE_TYPE_SIM_CARD_BOTH));
746             }
747             if (ringtoneUri.empty()) {
748                 ringtoneUri = GetPresetRingToneUriByType(dataShareHelper, to_string(ringtoneTypeMap_[ringtoneType]));
749             }
750             if (ringtoneUri.empty()) {
751                 ringtoneUri = GetPresetRingToneUriByType(dataShareHelper, to_string(RING_TONE_TYPE_SIM_CARD_BOTH));
752             }
753             break;
754         default:
755             break;
756     }
757     if (ringtoneUri.empty()) {
758         MEDIA_LOGI("No ring tone uri for type %{public}d. Return NO_RING_SOUND", ringtoneType);
759         return NO_RING_SOUND;
760     }
761     dataShareHelper->Release();
762     return ringtoneUri;
763 }
764 
GetRingtoneTitle(const std::string & ringtoneUri)765 std::string SystemSoundManagerImpl::GetRingtoneTitle(const std::string &ringtoneUri)
766 {
767     std::lock_guard<std::mutex> lock(uriMutex_);
768     std::string ringtoneTitle = "";
769     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
770     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ringtoneUri,
771         "Create dataShare failed, datashare or ringtone library error.");
772     DataShare::DatashareBusinessError businessError;
773     DataShare::DataSharePredicates queryPredicatesByUri;
774     queryPredicatesByUri.EqualTo(RINGTONE_COLUMN_DATA, ringtoneUri);
775     auto resultSetByUri = dataShareHelper->Query(RINGTONEURI, queryPredicatesByUri, COLUMNS, &businessError);
776     auto resultsByUri = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSetByUri));
777     unique_ptr<RingtoneAsset> ringtoneAssetByUri = resultsByUri->GetFirstObject();
778     if (ringtoneAssetByUri != nullptr) {
779         ringtoneTitle = ringtoneAssetByUri->GetTitle();
780     }
781     resultSetByUri == nullptr ? : resultSetByUri->Close();
782     dataShareHelper->Release();
783     return ringtoneTitle;
784 }
785 
GetRingtonePlayer(const shared_ptr<Context> & context,RingtoneType ringtoneType)786 std::shared_ptr<RingtonePlayer> SystemSoundManagerImpl::GetRingtonePlayer(const shared_ptr<Context> &context,
787     RingtoneType ringtoneType)
788 {
789     std::lock_guard<std::mutex> lock(playerMutex_);
790     CHECK_AND_RETURN_RET_LOG(IsRingtoneTypeValid(ringtoneType), nullptr, "invalid ringtone type");
791     MEDIA_LOGI("GetRingtonePlayer: for ringtoneType %{public}d", ringtoneType);
792 
793     std::shared_ptr<RingtonePlayer> ringtonePlayer = std::make_shared<RingtonePlayerImpl>(context, *this, ringtoneType);
794     CHECK_AND_RETURN_RET_LOG(ringtonePlayer != nullptr, nullptr,
795         "Failed to create ringtone player object");
796     return ringtonePlayer;
797 }
798 
GetSpecificRingTonePlayer(const shared_ptr<Context> & context,const RingtoneType ringtoneType,string & ringtoneUri)799 std::shared_ptr<RingtonePlayer> SystemSoundManagerImpl::GetSpecificRingTonePlayer(
800     const shared_ptr<Context> &context, const RingtoneType ringtoneType, string &ringtoneUri)
801 {
802     std::lock_guard<std::mutex> lock(playerMutex_);
803     CHECK_AND_RETURN_RET_LOG(IsRingtoneTypeValid(ringtoneType), nullptr, "invalid ringtone type");
804     MEDIA_LOGI("GetSpecificRingTonePlayer: for ringtoneType %{public}d", ringtoneType);
805 
806     if (ringtoneUri.empty()) {
807         std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
808         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr,
809             "Create dataShare failed, datashare or ringtone library error.");
810 
811         ringtoneUri = GetRingtoneUriByType(dataShareHelper, to_string(ringtoneTypeMap_[ringtoneType]));
812         if (ringtoneUri.empty()) {
813             ringtoneUri = GetRingtoneUriByType(dataShareHelper, to_string(RING_TONE_TYPE_SIM_CARD_BOTH));
814         }
815         if (ringtoneUri.empty()) {
816             std::shared_ptr<ToneAttrs> ringtoneAttrs = GetDefaultRingtoneAttrs(context, ringtoneType);
817             if (ringtoneAttrs != nullptr) {
818                 ringtoneUri = ringtoneAttrs ->GetUri();
819             } else {
820                 MEDIA_LOGE("GetRingtoneUri: Failed to get the default ringtone!");
821             }
822         }
823         dataShareHelper->Release();
824         std::shared_ptr<RingtonePlayer> ringtonePlayer = std::make_shared<RingtonePlayerImpl>(context,
825             *this, ringtoneType);
826         CHECK_AND_RETURN_RET_LOG(ringtonePlayer != nullptr, nullptr,
827             "Failed to create ringtone player object");
828         return ringtonePlayer;
829     }
830     std::shared_ptr<RingtonePlayer> ringtonePlayer = std::make_shared<RingtonePlayerImpl>(context,
831         *this, ringtoneType, ringtoneUri);
832     CHECK_AND_RETURN_RET_LOG(ringtonePlayer != nullptr, nullptr,
833         "Failed to create ringtone player object");
834     return ringtonePlayer;
835 }
836 
GetSystemTonePlayer(const std::shared_ptr<AbilityRuntime::Context> & context,SystemToneType systemToneType)837 std::shared_ptr<SystemTonePlayer> SystemSoundManagerImpl::GetSystemTonePlayer(
838     const std::shared_ptr<AbilityRuntime::Context> &context, SystemToneType systemToneType)
839 {
840     std::lock_guard<std::mutex> lock(playerMutex_);
841     CHECK_AND_RETURN_RET_LOG(IsSystemToneTypeValid(systemToneType), nullptr, "invalid system tone type");
842     MEDIA_LOGI("GetSystemTonePlayer: for systemToneType %{public}d", systemToneType);
843 
844     std::shared_ptr<SystemTonePlayer> systemTonePlayer =
845         std::make_shared<SystemTonePlayerImpl>(context, *this, systemToneType);
846     CHECK_AND_RETURN_RET_LOG(systemTonePlayer != nullptr, nullptr,
847         "Failed to create system tone player object");
848     return systemTonePlayer;
849 }
850 
UpdateShotToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const int32_t & toneId,SystemToneType systemToneType,const int32_t & num)851 int32_t SystemSoundManagerImpl::UpdateShotToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
852     const int32_t &toneId, SystemToneType systemToneType, const int32_t &num)
853 {
854     ShotToneType type = SHOT_TONE_TYPE_SIM_CARD_1;
855     DataSharePredicates updateOnlyPredicates;
856     DataShareValuesBucket updateOnlyValuesBucket;
857     updateOnlyPredicates.SetWhereClause(RINGTONE_COLUMN_SHOT_TONE_TYPE + " = ? AND " +
858         RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE + " = ? ");
859     updateOnlyPredicates.SetWhereArgs({to_string(systemTypeMap_[systemToneType]),
860         to_string(SOURCE_TYPE_CUSTOMISED)});
861     updateOnlyValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_TYPE, RING_TONE_TYPE_NOT);
862     updateOnlyValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
863     dataShareHelper->Update(RINGTONEURI, updateOnlyPredicates, updateOnlyValuesBucket);
864 
865     DataSharePredicates updateBothPredicates;
866     DataShareValuesBucket updateBothValuesBucket;
867     if (systemTypeMap_[systemToneType] == SHOT_TONE_TYPE_SIM_CARD_1) {
868         type = SHOT_TONE_TYPE_SIM_CARD_2;
869     }
870     updateBothPredicates.SetWhereClause(RINGTONE_COLUMN_SHOT_TONE_TYPE + " = ? AND " +
871         RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE + " = ? ");
872     updateBothPredicates.SetWhereArgs({to_string(SHOT_TONE_TYPE_SIM_CARD_BOTH),
873         to_string(SOURCE_TYPE_CUSTOMISED)});
874     updateBothValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_TYPE, type);
875     dataShareHelper->Update(RINGTONEURI, updateBothPredicates, updateBothValuesBucket);
876 
877     DataSharePredicates updatePredicates;
878     DataShareValuesBucket updateValuesBucket;
879     if (((num == SHOT_TONE_TYPE_SIM_CARD_1 || num == RING_TONE_TYPE_SIM_CARD_BOTH) &&
880         (systemTypeMap_[systemToneType] == SHOT_TONE_TYPE_SIM_CARD_2)) ||
881         ((num == SHOT_TONE_TYPE_SIM_CARD_2 || num == RING_TONE_TYPE_SIM_CARD_BOTH) &&
882         (systemTypeMap_[systemToneType] == SHOT_TONE_TYPE_SIM_CARD_1))) {
883         type = SHOT_TONE_TYPE_SIM_CARD_BOTH;
884     } else {
885         type = shotToneTypeMap_[systemToneType];
886     }
887     updatePredicates.SetWhereClause(RINGTONE_COLUMN_TONE_ID + " = ? ");
888     updatePredicates.SetWhereArgs({to_string(toneId)});
889     updateValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_TYPE, type);
890     updateValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE, SOURCE_TYPE_CUSTOMISED);
891     return dataShareHelper->Update(RINGTONEURI, updatePredicates, updateValuesBucket);
892 }
893 
UpdateNotificatioToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const int32_t & toneId)894 int32_t SystemSoundManagerImpl::UpdateNotificatioToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
895     const int32_t &toneId)
896 {
897     DataSharePredicates updateOldPredicates;
898     DataShareValuesBucket updateOldValuesBucket;
899     updateOldPredicates.SetWhereClause(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE + " = ? AND " +
900         RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE + " = ? ");
901     updateOldPredicates.SetWhereArgs({to_string(NOTIFICATION_TONE_TYPE), to_string(SOURCE_TYPE_CUSTOMISED)});
902     updateOldValuesBucket.Put(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE, NOTIFICATION_TONE_TYPE_NOT);
903     updateOldValuesBucket.Put(RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
904     dataShareHelper->Update(RINGTONEURI, updateOldPredicates, updateOldValuesBucket);
905 
906     DataSharePredicates updatePredicates;
907     DataShareValuesBucket updateValuesBucket;
908     updatePredicates.SetWhereClause(RINGTONE_COLUMN_TONE_ID + " = ? ");
909     updatePredicates.SetWhereArgs({to_string(toneId)});
910     updateValuesBucket.Put(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE, NOTIFICATION_TONE_TYPE);
911     updateValuesBucket.Put(RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE, SOURCE_TYPE_CUSTOMISED);
912     return dataShareHelper->Update(RINGTONEURI, updatePredicates, updateValuesBucket);
913 }
914 
SetNoSystemToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,SystemToneType systemToneType)915 int32_t SystemSoundManagerImpl::SetNoSystemToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
916     SystemToneType systemToneType)
917 {
918     MEDIA_LOGI("Set no audio uri for system tone type %{public}d", systemToneType);
919     int32_t result = 0;
920     // Removes the flag for the current system tone uri.
921     result += RemoveSourceTypeForSystemTone(dataShareHelper, systemToneType, SOURCE_TYPE_CUSTOMISED);
922     // Removes the flag for the preset system tone uri.
923     result += RemoveSourceTypeForSystemTone(dataShareHelper, systemToneType, SOURCE_TYPE_PRESET);
924     return result;
925 }
926 
RemoveSourceTypeForSystemTone(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,SystemToneType systemToneType,SourceType sourceType)927 int32_t SystemSoundManagerImpl::RemoveSourceTypeForSystemTone(
928     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, SystemToneType systemToneType, SourceType sourceType)
929 {
930     int32_t result = 0;
931     switch (systemToneType) {
932         case SYSTEM_TONE_TYPE_SIM_CARD_0:
933         case SYSTEM_TONE_TYPE_SIM_CARD_1: {
934             // SIM_CARD_0 or SIM_CARD_1
935             DataSharePredicates updateOnlyPredicates;
936             DataShareValuesBucket updateOnlyValuesBucket;
937             updateOnlyPredicates.SetWhereClause(RINGTONE_COLUMN_SHOT_TONE_TYPE + " = ? AND " +
938                 RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE + " = ? ");
939             updateOnlyPredicates.SetWhereArgs({to_string(systemTypeMap_[systemToneType]), to_string(sourceType)});
940             updateOnlyValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_TYPE, RING_TONE_TYPE_NOT);
941             updateOnlyValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
942             result += dataShareHelper->Update(RINGTONEURI, updateOnlyPredicates, updateOnlyValuesBucket);
943             // both SIM_CARD_0 and SIM_CARD_1
944             DataSharePredicates updateBothPredicates;
945             DataShareValuesBucket updateBothValuesBucket;
946             ShotToneType type = SHOT_TONE_TYPE_SIM_CARD_1;
947             if (systemTypeMap_[systemToneType] == SHOT_TONE_TYPE_SIM_CARD_1) {
948                 type = SHOT_TONE_TYPE_SIM_CARD_2;
949             }
950             updateBothPredicates.SetWhereClause(RINGTONE_COLUMN_SHOT_TONE_TYPE + " = ? AND " +
951                 RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE + " = ? ");
952             updateBothPredicates.SetWhereArgs({to_string(SHOT_TONE_TYPE_SIM_CARD_BOTH), to_string(sourceType)});
953             updateBothValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_TYPE, type);
954             result += dataShareHelper->Update(RINGTONEURI, updateBothPredicates, updateBothValuesBucket);
955             break;
956         }
957         case SYSTEM_TONE_TYPE_NOTIFICATION: {
958             DataSharePredicates updateOldPredicates;
959             DataShareValuesBucket updateOldValuesBucket;
960             updateOldPredicates.SetWhereClause(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE + " = ? AND " +
961                 RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE + " = ? ");
962             updateOldPredicates.SetWhereArgs({to_string(NOTIFICATION_TONE_TYPE), to_string(sourceType)});
963             updateOldValuesBucket.Put(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE, NOTIFICATION_TONE_TYPE_NOT);
964             updateOldValuesBucket.Put(RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
965             result += dataShareHelper->Update(RINGTONEURI, updateOldPredicates, updateOldValuesBucket);
966             break;
967         }
968         default:
969             MEDIA_LOGE("The system tone type [%{public}d] is invalid!", systemToneType);
970             break;
971     }
972     return result;
973 }
974 
SetSystemToneUri(const shared_ptr<Context> & context,const string & uri,SystemToneType systemToneType)975 int32_t SystemSoundManagerImpl::SetSystemToneUri(const shared_ptr<Context> &context, const string &uri,
976     SystemToneType systemToneType)
977 {
978     std::lock_guard<std::mutex> lock(uriMutex_);
979     CHECK_AND_RETURN_RET_LOG(IsSystemToneTypeValid(systemToneType), MSERR_INVALID_VAL, "Invalid system tone type");
980 
981     MEDIA_LOGI("SetSystemToneUri: systemToneType %{public}d, uri %{public}s", systemToneType, uri.c_str());
982     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
983     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR, "Create dataShare failed, datashare or library error.");
984 
985     if (uri == NO_SYSTEM_SOUND) {
986         int32_t changedRows = SetNoSystemToneUri(dataShareHelper, systemToneType);
987         MEDIA_LOGI("SetNoSystemToneUri result: changedRows %{public}d", changedRows);
988         dataShareHelper->Release();
989         return SUCCESS;
990     }
991 
992     DataShare::DatashareBusinessError businessError;
993     DataShare::DataSharePredicates queryPredicates;
994     DataShare::DataSharePredicates queryPredicatesByUri;
995     queryPredicatesByUri.EqualTo(RINGTONE_COLUMN_DATA, uri);
996     auto resultSetByUri = dataShareHelper->Query(RINGTONEURI, queryPredicatesByUri, COLUMNS, &businessError);
997     auto resultsByUri = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSetByUri));
998     unique_ptr<RingtoneAsset> ringtoneAssetByUri = resultsByUri->GetFirstObject();
999     if (ringtoneAssetByUri == nullptr) {
1000         resultSetByUri == nullptr ? : resultSetByUri->Close();
1001         dataShareHelper->Release();
1002         MEDIA_LOGE("Failed to find the uri in ringtone library!");
1003         return ERROR;
1004     }
1005     resultSetByUri == nullptr ? : resultSetByUri->Close();
1006     queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, TONE_TYPE_NOTIFICATION);
1007     auto resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1008     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1009     CHECK_AND_RETURN_RET_LOG(results != nullptr, ERROR, "query failed, ringtone library error.");
1010     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1011     while ((ringtoneAsset != nullptr) && (uri != ringtoneAsset->GetPath())) {
1012         ringtoneAsset = results->GetNextObject();
1013     }
1014     if (ringtoneAsset != nullptr) {
1015         int32_t changedRows = 0;
1016         if (systemToneType == SYSTEM_TONE_TYPE_NOTIFICATION) {
1017             changedRows = UpdateNotificatioToneUri(dataShareHelper, ringtoneAsset->GetId());
1018         } else {
1019             changedRows = UpdateShotToneUri(dataShareHelper, ringtoneAsset->GetId(),
1020                 systemToneType, ringtoneAsset->GetShottoneType());
1021         }
1022         resultSet == nullptr ? : resultSet->Close();
1023         SetExtRingtoneUri(uri, ringtoneAsset->GetTitle(), systemToneType, TONE_TYPE_NOTIFICATION, changedRows);
1024         return changedRows > 0 ? SUCCESS : ERROR;
1025     }
1026     resultSet == nullptr ? : resultSet->Close();
1027     dataShareHelper->Release();
1028     return TYPEERROR;
1029 }
1030 
GetShotToneUriByType(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & type)1031 std::string SystemSoundManagerImpl::GetShotToneUriByType(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
1032     const std::string &type)
1033 {
1034     int32_t errCode = 0;
1035     int32_t result = 0;
1036     std::string uri = "";
1037     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, uri,
1038         "Invalid dataShare, datashare or ringtone library error.");
1039     DataShare::DatashareBusinessError businessError;
1040     DataShare::DataSharePredicates queryPredicates;
1041     queryPredicates.SetWhereClause(RINGTONE_COLUMN_SHOT_TONE_TYPE + " = ? AND " +
1042         RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE + " = ? ");
1043     queryPredicates.SetWhereArgs({type, to_string(SOURCE_TYPE_CUSTOMISED)});
1044     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
1045     errCode = businessError.GetCode();
1046     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1047     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1048         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1049     MEDIA_LOGI("systemsoundmanagerimpl errCode:%{public}d, result :%{public}d ", errCode, result);
1050     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
1051         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1052         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, uri,
1053             "Invalid dataShare, datashare or ringtone library error.");
1054         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1055     }
1056     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1057     CHECK_AND_RETURN_RET_LOG(results != nullptr, uri, "query failed, ringtone library error.");
1058     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1059     if (ringtoneAsset != nullptr) {
1060         uri = ringtoneAsset->GetPath();
1061     }
1062     resultSet == nullptr ? : resultSet->Close();
1063     return uri;
1064 }
1065 
GetPresetShotToneUriByType(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & type)1066 std::string SystemSoundManagerImpl::GetPresetShotToneUriByType(
1067     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, const std::string &type)
1068 {
1069     int32_t errCode = 0;
1070     int32_t result = 0;
1071     std::string uri = "";
1072     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, uri,
1073         "Invalid dataShare, datashare or ringtone library error.");
1074     DataShare::DatashareBusinessError businessError;
1075     DataShare::DataSharePredicates queryPredicates;
1076     queryPredicates.SetWhereClause(RINGTONE_COLUMN_SHOT_TONE_TYPE + " = ? AND " +
1077         RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE + " = ? ");
1078     queryPredicates.SetWhereArgs({type, to_string(SOURCE_TYPE_PRESET)});
1079     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
1080     errCode = businessError.GetCode();
1081     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1082     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1083         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1084     MEDIA_LOGI("systemsoundmanagerimpl errCode:%{public}d, result :%{public}d ", errCode, result);
1085     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
1086         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1087         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, uri,
1088             "Invalid dataShare, datashare or ringtone library error.");
1089         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1090     }
1091     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1092     CHECK_AND_RETURN_RET_LOG(results != nullptr, uri, "query failed, ringtone library error.");
1093     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1094     if (ringtoneAsset != nullptr) {
1095         uri = ringtoneAsset->GetPath();
1096     }
1097     resultSet == nullptr ? : resultSet->Close();
1098     return uri;
1099 }
1100 
GetNotificationToneUriByType(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper)1101 std::string SystemSoundManagerImpl::GetNotificationToneUriByType(
1102     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper)
1103 {
1104     std::string uri = "";
1105     int32_t errCode = 0;
1106     int32_t result = 0;
1107     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, uri,
1108         "Invalid dataShare, datashare or ringtone library error.");
1109     DataShare::DatashareBusinessError businessError;
1110     DataShare::DataSharePredicates queryPredicates;
1111     queryPredicates.SetWhereClause(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE + " = ? AND " +
1112         RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE + " = ? ");
1113     queryPredicates.SetWhereArgs({to_string(NOTIFICATION_TONE_TYPE), to_string(SOURCE_TYPE_CUSTOMISED)});
1114     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
1115     errCode = businessError.GetCode();
1116     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1117     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1118         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1119     MEDIA_LOGI("systemsoundmanagerimpl errCode:%{public}d, result :%{public}d ", errCode, result);
1120     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
1121         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1122         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, uri,
1123             "Invalid dataShare, datashare or ringtone library error.");
1124         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1125     }
1126     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1127     CHECK_AND_RETURN_RET_LOG(results != nullptr, uri, "query failed, ringtone library error.");
1128     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1129     if (ringtoneAsset != nullptr) {
1130         uri = ringtoneAsset->GetPath();
1131     }
1132     resultSet == nullptr ? : resultSet->Close();
1133     return uri;
1134 }
1135 
GetPresetNotificationToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper)1136 std::string SystemSoundManagerImpl::GetPresetNotificationToneUri(
1137     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper)
1138 {
1139     std::string uri = "";
1140     int32_t errCode = 0;
1141     int32_t result = 0;
1142     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, uri,
1143         "Invalid dataShare, datashare or ringtone library error.");
1144     DataShare::DatashareBusinessError businessError;
1145     DataShare::DataSharePredicates queryPredicates;
1146     queryPredicates.SetWhereClause(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE + " = ? AND " +
1147         RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE + " = ? ");
1148     queryPredicates.SetWhereArgs({to_string(NOTIFICATION_TONE_TYPE), to_string(SOURCE_TYPE_PRESET)});
1149     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
1150     errCode = businessError.GetCode();
1151     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1152     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1153         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1154     MEDIA_LOGI("systemsoundmanagerimpl errCode:%{public}d, result :%{public}d ", errCode, result);
1155     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
1156         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1157         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, uri,
1158             "Invalid dataShare, datashare or ringtone library error.");
1159         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1160     }
1161     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1162     CHECK_AND_RETURN_RET_LOG(results != nullptr, uri, "query failed, ringtone library error.");
1163     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1164     if (ringtoneAsset != nullptr) {
1165         uri = ringtoneAsset->GetPath();
1166     }
1167     resultSet == nullptr ? : resultSet->Close();
1168     return uri;
1169 }
1170 
GetSystemToneUri(const std::shared_ptr<AbilityRuntime::Context> & context,SystemToneType systemToneType)1171 std::string SystemSoundManagerImpl::GetSystemToneUri(const std::shared_ptr<AbilityRuntime::Context> &context,
1172     SystemToneType systemToneType)
1173 {
1174     CHECK_AND_RETURN_RET_LOG(IsSystemToneTypeValid(systemToneType), "", "Invalid system tone type");
1175     std::string systemToneUri = "";
1176     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1177     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, "",
1178         "Create dataShare failed, datashare or ringtone library error.");
1179     switch (systemToneType) {
1180         case SYSTEM_TONE_TYPE_SIM_CARD_0:
1181         case SYSTEM_TONE_TYPE_SIM_CARD_1:
1182             systemToneUri = GetShotToneUriByType(dataShareHelper, to_string(systemTypeMap_[systemToneType]));
1183             if (systemToneUri.empty()) {
1184                 systemToneUri = GetShotToneUriByType(dataShareHelper, to_string(RING_TONE_TYPE_SIM_CARD_BOTH));
1185             }
1186             if (systemToneUri.empty()) {
1187                 systemToneUri = GetPresetShotToneUriByType(dataShareHelper, to_string(systemTypeMap_[systemToneType]));
1188             }
1189             if (systemToneUri.empty()) {
1190                 systemToneUri = GetPresetShotToneUriByType(dataShareHelper, to_string(RING_TONE_TYPE_SIM_CARD_BOTH));
1191             }
1192             break;
1193         case SYSTEM_TONE_TYPE_NOTIFICATION:
1194             systemToneUri = GetNotificationToneUriByType(dataShareHelper);
1195             if (systemToneUri.empty()) {
1196                 systemToneUri = GetPresetNotificationToneUri(dataShareHelper);
1197             }
1198             break;
1199         default:
1200             break;
1201     }
1202     if (systemToneUri.empty()) {
1203         MEDIA_LOGI("No system tone uri for type %{public}d. Return NO_SYSTEM_SOUND", systemToneType);
1204         return NO_SYSTEM_SOUND;
1205     }
1206     dataShareHelper->Release();
1207     MEDIA_LOGI("Finish to get system tone uri: type %{public}d, uri %{public}s", systemToneType, systemToneUri.c_str());
1208     return systemToneUri;
1209 }
1210 
GetDefaultRingtoneAttrs(const shared_ptr<Context> & context,RingtoneType ringtoneType)1211 std::shared_ptr<ToneAttrs> SystemSoundManagerImpl::GetDefaultRingtoneAttrs(
1212     const shared_ptr<Context> &context, RingtoneType ringtoneType)
1213 {
1214     int32_t errCode = 0;
1215     int32_t result = 0;
1216     MEDIA_LOGI("GetDefaultRingtoneAttrs : Enter the getDefaultRingtoneAttrs interface");
1217     std::lock_guard<std::mutex> lock(uriMutex_);
1218     CHECK_AND_RETURN_RET_LOG(IsRingtoneTypeValid(ringtoneType),  nullptr, "Invalid ringtone type");
1219     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1220     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr,
1221         "Create dataShare failed, datashare or ringtone library error.");
1222     DataShare::DatashareBusinessError businessError;
1223     DataShare::DataSharePredicates queryPredicates;
1224     ringtoneAttrs_ = nullptr;
1225     std::vector<std::string> onClause;
1226     onClause.push_back(RINGTONE_TABLE + "." + RINGTONE_COLUMN_TONE_ID + "=" +
1227         PRELOAD_CONFIG_TABLE + "." + PRELOAD_CONFIG_COLUMN_TONE_ID);
1228     queryPredicates.InnerJoin(PRELOAD_CONFIG_TABLE)->On(onClause)->EqualTo(
1229         PRELOAD_CONFIG_TABLE + "." + PRELOAD_CONFIG_COLUMN_RING_TONE_TYPE, defaultoneTypeMap_[ringtoneType]);
1230     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, JOIN_COLUMNS, &businessError);
1231     errCode = businessError.GetCode();
1232     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1233     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1234         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1235     MEDIA_LOGI("systemsoundmanagerimpl errCode:%{public}d, result :%{public}d ", errCode, result);
1236     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
1237         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1238         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr,
1239             "Invalid dataShare, datashare or ringtone library error.");
1240         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, JOIN_COLUMNS, &businessError);
1241     }
1242     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1243     CHECK_AND_RETURN_RET_LOG(results != nullptr, nullptr, "single sim card failed, ringtone library error.");
1244     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1245     while ((ringtoneAsset != nullptr) && (TONE_TYPE_RINGTONE != ringtoneAsset->GetToneType())) {
1246         ringtoneAsset = results->GetNextObject();
1247     }
1248     if (ringtoneAsset != nullptr) {
1249         ringtoneAttrs_ = std::make_shared<ToneAttrs>(ringtoneAsset->GetTitle(),
1250             ringtoneAsset->GetDisplayName(), ringtoneAsset->GetPath(),
1251             sourceTypeMap_[ringtoneAsset->GetSourceType()], TONE_CATEGORY_RINGTONE);
1252         MEDIA_LOGI("RingtoneAttrs_ : DisplayName = %{public}s, Path = %{public}s , Title = %{public}s",
1253             ringtoneAsset->GetDisplayName().c_str(), ringtoneAsset->GetPath().c_str(),
1254             ringtoneAsset->GetTitle().c_str());
1255     } else {
1256         MEDIA_LOGE("GetDefaultRingtoneAttrs: no single card default ringtone in the ringtone library!");
1257     }
1258     resultSet == nullptr ? : resultSet->Close();
1259     dataShareHelper->Release();
1260     return ringtoneAttrs_;
1261 }
1262 
GetRingtoneAttrList(const std::shared_ptr<AbilityRuntime::Context> & context,RingtoneType ringtoneType)1263 std::vector<std::shared_ptr<ToneAttrs>> SystemSoundManagerImpl::GetRingtoneAttrList(
1264     const std::shared_ptr<AbilityRuntime::Context> &context, RingtoneType ringtoneType)
1265 {
1266     int32_t errCode = 0;
1267     int32_t result = 0;
1268     MEDIA_LOGI("GetRingtoneAttrList : Enter the getRingtoneAttrList interface");
1269     std::lock_guard<std::mutex> lock(uriMutex_);
1270     ringtoneAttrsArray_.clear();
1271     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1272     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ringtoneAttrsArray_,
1273         "Create dataShare failed, datashare or ringtone library error.");
1274     DataShare::DatashareBusinessError businessError;
1275     DataShare::DataSharePredicates queryPredicates;
1276     queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, to_string(TONE_TYPE_RINGTONE));
1277     queryPredicates.GreaterThan(RINGTONE_COLUMN_MEDIA_TYPE, to_string(RINGTONE_MEDIA_TYPE_INVALID));
1278     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
1279     errCode = businessError.GetCode();
1280     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1281     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1282         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1283     MEDIA_LOGI("systemsoundmanagerimpl errCode:%{public}d, result :%{public}d ", errCode, result);
1284     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
1285         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1286         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ringtoneAttrsArray_,
1287             "Invalid dataShare, datashare or ringtone library error.");
1288         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1289     }
1290     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1291     CHECK_AND_RETURN_RET_LOG(results != nullptr, ringtoneAttrsArray_, "query failed, ringtone library error.");
1292     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1293     while (ringtoneAsset != nullptr) {
1294         ringtoneAttrs_ = std::make_shared<ToneAttrs>(ringtoneAsset->GetTitle(),
1295             ringtoneAsset->GetDisplayName(), ringtoneAsset->GetPath(),
1296             sourceTypeMap_[ringtoneAsset->GetSourceType()], TONE_CATEGORY_RINGTONE);
1297         ringtoneAttrsArray_.push_back(ringtoneAttrs_);
1298         ringtoneAsset = results->GetNextObject();
1299     }
1300     if (ringtoneAsset != nullptr) {
1301         MEDIA_LOGI("RingtoneAttrsArray_ : DisplayName = %{public}s, Path = %{public}s",
1302             ringtoneAsset->GetDisplayName().c_str(), ringtoneAsset->GetPath().c_str());
1303     }
1304     if (ringtoneAttrsArray_.empty()) {
1305         MEDIA_LOGE("GetRingtoneAttrList: no ringtone in the ringtone library!");
1306     }
1307     resultSet == nullptr ? : resultSet->Close();
1308     dataShareHelper->Release();
1309     return ringtoneAttrsArray_;
1310 }
1311 
GetDefaultSystemToneAttrs(const std::shared_ptr<AbilityRuntime::Context> & context,SystemToneType systemToneType)1312 std::shared_ptr<ToneAttrs> SystemSoundManagerImpl::GetDefaultSystemToneAttrs(
1313     const std::shared_ptr<AbilityRuntime::Context> &context, SystemToneType systemToneType)
1314 {
1315     MEDIA_LOGI("GetDefaultSystemToneAttrs : Enter the getDefaultSystemToneAttrs interface");
1316     int32_t errCode = 0;
1317     int32_t result = 0;
1318     std::lock_guard<std::mutex> lock(uriMutex_);
1319     CHECK_AND_RETURN_RET_LOG(IsSystemToneTypeValid(systemToneType),  nullptr, "Invalid systemtone type");
1320     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1321     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr,
1322         "Create dataShare failed, datashare or ringtone library error.");
1323     std::string ringToneType = systemToneType == SYSTEM_TONE_TYPE_NOTIFICATION ?
1324         RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE : RINGTONE_COLUMN_SHOT_TONE_TYPE;
1325     int32_t category = systemToneType == SYSTEM_TONE_TYPE_NOTIFICATION ?
1326         TONE_CATEGORY_NOTIFICATION : TONE_CATEGORY_TEXT_MESSAGE;
1327     DataShare::DatashareBusinessError businessError;
1328     DataShare::DataSharePredicates queryPredicates;
1329     systemtoneAttrs_ = nullptr;
1330     std::vector<std::string> onClause;
1331     onClause.push_back(RINGTONE_TABLE + "." + RINGTONE_COLUMN_TONE_ID + "=" +
1332         PRELOAD_CONFIG_TABLE + "." + PRELOAD_CONFIG_COLUMN_TONE_ID);
1333     queryPredicates.InnerJoin(PRELOAD_CONFIG_TABLE)->On(onClause)->EqualTo(
1334         PRELOAD_CONFIG_TABLE + "." + PRELOAD_CONFIG_COLUMN_RING_TONE_TYPE, defaultsystemTypeMap_[systemToneType]);
1335     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, JOIN_COLUMNS, &businessError);
1336     errCode = businessError.GetCode();
1337     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1338     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1339         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1340     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
1341         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1342         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr,
1343             "Invalid dataShare, datashare or ringtone library error.");
1344         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, JOIN_COLUMNS, &businessError);
1345     }
1346     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1347     CHECK_AND_RETURN_RET_LOG(results != nullptr, nullptr, "query single systemtone failed, ringtone library error.");
1348     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1349     while ((ringtoneAsset != nullptr) && IsSystemToneType(ringtoneAsset, systemToneType)) {
1350         ringtoneAsset = results->GetNextObject();
1351     }
1352     if (ringtoneAsset != nullptr) {
1353         systemtoneAttrs_ = std::make_shared<ToneAttrs>(ringtoneAsset->GetTitle(),
1354             ringtoneAsset->GetDisplayName(), ringtoneAsset->GetPath(),
1355             sourceTypeMap_[ringtoneAsset->GetSourceType()], category);
1356     } else {
1357         MEDIA_LOGE("GetDefaultSystemToneAttrs: no single default systemtone in the ringtone library!");
1358     }
1359     resultSet == nullptr ? : resultSet->Close();
1360     dataShareHelper->Release();
1361     return systemtoneAttrs_;
1362 }
1363 
GetSystemToneAttrList(const std::shared_ptr<AbilityRuntime::Context> & context,SystemToneType systemToneType)1364 std::vector<std::shared_ptr<ToneAttrs>> SystemSoundManagerImpl::GetSystemToneAttrList(
1365     const std::shared_ptr<AbilityRuntime::Context> &context, SystemToneType systemToneType)
1366 {
1367     int32_t errCode = 0;
1368     int32_t result = 0;
1369     std::lock_guard<std::mutex> lock(uriMutex_);
1370     systemtoneAttrsArray_.clear();
1371     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1372     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, systemtoneAttrsArray_,
1373         "Create dataShare failed, datashare or ringtone library error.");
1374     int32_t category = systemToneType == SYSTEM_TONE_TYPE_NOTIFICATION ?
1375         TONE_CATEGORY_NOTIFICATION : TONE_CATEGORY_TEXT_MESSAGE;
1376     DataShare::DatashareBusinessError businessError;
1377     DataShare::DataSharePredicates queryPredicates;
1378     queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, to_string(TONE_TYPE_NOTIFICATION));
1379     queryPredicates.GreaterThan(RINGTONE_COLUMN_MEDIA_TYPE, to_string(RINGTONE_MEDIA_TYPE_INVALID));
1380     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
1381     errCode = businessError.GetCode();
1382     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1383     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1384         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1385     MEDIA_LOGI("systemsoundmanagerimpl errCode:%{public}d, result :%{public}d ", errCode, result);
1386     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
1387         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1388         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, systemtoneAttrsArray_,
1389             "Invalid dataShare, datashare or ringtone library error.");
1390         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1391     }
1392     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1393     CHECK_AND_RETURN_RET_LOG(results != nullptr, systemtoneAttrsArray_, "query failed, ringtone library error.");
1394     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1395     while (ringtoneAsset != nullptr) {
1396         systemtoneAttrs_ = std::make_shared<ToneAttrs>(ringtoneAsset->GetTitle(),
1397             ringtoneAsset->GetDisplayName(), ringtoneAsset->GetPath(),
1398             sourceTypeMap_[ringtoneAsset->GetSourceType()], category);
1399         systemtoneAttrsArray_.push_back(systemtoneAttrs_);
1400         ringtoneAsset = results->GetNextObject();
1401     }
1402     if (systemtoneAttrsArray_.empty()) {
1403         MEDIA_LOGE("GetSystemToneAttrList: no systemtone in the ringtone library!");
1404     }
1405     resultSet == nullptr ? : resultSet->Close();
1406     dataShareHelper->Release();
1407     return systemtoneAttrsArray_;
1408 }
1409 
SetAlarmToneUri(const std::shared_ptr<AbilityRuntime::Context> & context,const std::string & uri)1410 int32_t SystemSoundManagerImpl::SetAlarmToneUri(const std::shared_ptr<AbilityRuntime::Context> &context,
1411     const std::string &uri)
1412 {
1413     std::lock_guard<std::mutex> lock(uriMutex_);
1414     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1415     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR, "Create dataShare failed, datashare or library error.");
1416     DataShare::DatashareBusinessError businessError;
1417     DataShare::DataSharePredicates queryPredicates;
1418     DataShare::DataSharePredicates queryPredicatesByUri;
1419     queryPredicatesByUri.EqualTo(RINGTONE_COLUMN_DATA, uri);
1420     auto resultSetByUri = dataShareHelper->Query(RINGTONEURI, queryPredicatesByUri, COLUMNS, &businessError);
1421     auto resultsByUri = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSetByUri));
1422     unique_ptr<RingtoneAsset> ringtoneAssetByUri = resultsByUri->GetFirstObject();
1423     if (ringtoneAssetByUri == nullptr) {
1424         resultSetByUri == nullptr ? : resultSetByUri->Close();
1425         dataShareHelper->Release();
1426         return ERROR;
1427     }
1428     resultSetByUri == nullptr ? : resultSetByUri->Close();
1429     queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, TONE_TYPE_ALARM);
1430     auto resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1431     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1432     CHECK_AND_RETURN_RET_LOG(results != nullptr, ERROR, "query failed, ringtone library error.");
1433     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1434     while ((ringtoneAsset != nullptr) && (uri != ringtoneAsset->GetPath())) {
1435         ringtoneAsset = results->GetNextObject();
1436     }
1437     if (ringtoneAsset != nullptr) {
1438         DataSharePredicates updateOldPredicates;
1439         DataShareValuesBucket updateOldValuesBucket;
1440         updateOldPredicates.SetWhereClause(RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE + " = ? ");
1441         updateOldPredicates.SetWhereArgs({to_string(SOURCE_TYPE_CUSTOMISED)});
1442         updateOldValuesBucket.Put(RINGTONE_COLUMN_ALARM_TONE_TYPE, ALARM_TONE_TYPE_NOT);
1443         updateOldValuesBucket.Put(RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
1444         dataShareHelper->Update(RINGTONEURI, updateOldPredicates, updateOldValuesBucket);
1445         DataSharePredicates updatePredicates;
1446         DataShareValuesBucket updateValuesBucket;
1447         updatePredicates.SetWhereClause(RINGTONE_COLUMN_TONE_ID + " = ? ");
1448         updatePredicates.SetWhereArgs({to_string(ringtoneAsset->GetId())});
1449         updateValuesBucket.Put(RINGTONE_COLUMN_ALARM_TONE_TYPE, ALARM_TONE_TYPE);
1450         updateValuesBucket.Put(RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE, SOURCE_TYPE_CUSTOMISED);
1451         int32_t changedRows = dataShareHelper->Update(RINGTONEURI, updatePredicates, updateValuesBucket);
1452         resultSet == nullptr ? : resultSet->Close();
1453         dataShareHelper->Release();
1454         SetExtRingtoneUri(uri, ringtoneAsset->GetTitle(), TONE_TYPE_ALARM, TONE_TYPE_ALARM, changedRows);
1455         return changedRows > 0 ? SUCCESS : ERROR;
1456     }
1457     resultSet == nullptr ? : resultSet->Close();
1458     dataShareHelper->Release();
1459     return TYPEERROR;
1460 }
1461 
GetAlarmToneUri(const std::shared_ptr<AbilityRuntime::Context> & context)1462 std::string SystemSoundManagerImpl::GetAlarmToneUri(const std::shared_ptr<AbilityRuntime::Context> &context)
1463 {
1464     int32_t count = 2;
1465     int32_t errCode = 0;
1466     int32_t result = 0;
1467     std::string alarmToneUri = "";
1468     std::lock_guard<std::mutex> lock(uriMutex_);
1469     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1470     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, alarmToneUri,
1471         "Create dataShare failed, datashare or ringtone library error.");
1472     DataShare::DatashareBusinessError businessError;
1473     DataShare::DataSharePredicates queryPredicates;
1474     queryPredicates.EqualTo(RINGTONE_COLUMN_ALARM_TONE_TYPE, to_string(ALARM_TONE_TYPE));
1475     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
1476     errCode = businessError.GetCode();
1477     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1478     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1479         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1480     MEDIA_LOGI("systemsoundmanagerimpl errCode:%{public}d, result :%{public}d ", errCode, result);
1481     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
1482         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1483         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, alarmToneUri,
1484             "Invalid dataShare, datashare or ringtone library error.");
1485         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1486     }
1487     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1488     CHECK_AND_RETURN_RET_LOG(results != nullptr, alarmToneUri, "query failed, ringtone library error.");
1489     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1490     while ((ringtoneAsset != nullptr) && (SOURCE_TYPE_CUSTOMISED !=
1491         ringtoneAsset->GetAlarmtoneSourceType()) && (results->GetCount() == count)) {
1492         ringtoneAsset = results->GetNextObject();
1493     }
1494     if (ringtoneAsset != nullptr) {
1495         alarmToneUri = ringtoneAsset->GetPath();
1496     } else {
1497         MEDIA_LOGE("GetAlarmToneUri: no alarmtone in the ringtone library!");
1498     }
1499     resultSet == nullptr ? : resultSet->Close();
1500     dataShareHelper->Release();
1501     return alarmToneUri;
1502 }
1503 
GetDefaultAlarmToneAttrs(const std::shared_ptr<AbilityRuntime::Context> & context)1504 std::shared_ptr<ToneAttrs> SystemSoundManagerImpl::GetDefaultAlarmToneAttrs(
1505     const std::shared_ptr<AbilityRuntime::Context> &context)
1506 {
1507     MEDIA_LOGI("GetDefaultAlarmToneAttrs : Enter the getDefaultAlarmToneAttrs interface");
1508     int32_t errCode = 0;
1509     int32_t result = 0;
1510     std::lock_guard<std::mutex> lock(uriMutex_);
1511     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1512     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr,
1513         "Create dataShare failed, datashare or ringtone library error.");
1514     DataShare::DatashareBusinessError businessError;
1515     DataShare::DataSharePredicates queryPredicates;
1516     alarmtoneAttrs_ = nullptr;
1517     std::vector<std::string> onClause;
1518     onClause.push_back(RINGTONE_TABLE + "." + RINGTONE_COLUMN_TONE_ID + "=" +
1519         PRELOAD_CONFIG_TABLE + "." + PRELOAD_CONFIG_COLUMN_TONE_ID);
1520     queryPredicates.InnerJoin(PRELOAD_CONFIG_TABLE)->On(onClause)->EqualTo(
1521         PRELOAD_CONFIG_TABLE + "." + PRELOAD_CONFIG_COLUMN_RING_TONE_TYPE, DEFAULT_ALARM_TYPE);
1522     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, JOIN_COLUMNS, &businessError);
1523     errCode = businessError.GetCode();
1524     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1525     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1526         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1527     MEDIA_LOGI("systemsoundmanagerimpl errCode:%{public}d, result :%{public}d ", errCode, result);
1528     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
1529         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1530         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr,
1531             "Invalid dataShare, datashare or ringtone library error.");
1532         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, JOIN_COLUMNS, &businessError);
1533     }
1534     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1535     CHECK_AND_RETURN_RET_LOG(results != nullptr, nullptr, "query failed, ringtone library error.");
1536     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1537     while ((ringtoneAsset != nullptr) && (TONE_TYPE_ALARM != ringtoneAsset->GetToneType())) {
1538         ringtoneAsset = results->GetNextObject();
1539     }
1540     if (ringtoneAsset != nullptr) {
1541         alarmtoneAttrs_ = std::make_shared<ToneAttrs>(ringtoneAsset->GetTitle(),
1542             ringtoneAsset->GetDisplayName(), ringtoneAsset->GetPath(),
1543             sourceTypeMap_[ringtoneAsset->GetSourceType()], TONE_CATEGORY_ALARM);
1544         MEDIA_LOGI("AlarmtoneAttrs_ : DisplayName = %{public}s, Path = %{public}s , Title = %{public}s",
1545             ringtoneAsset->GetDisplayName().c_str(), ringtoneAsset->GetPath().c_str(),
1546             ringtoneAsset->GetTitle().c_str());
1547     } else {
1548         MEDIA_LOGE("GetDefaultAlarmToneAttrs: no default alarmtone in the ringtone library!");
1549     }
1550     resultSet == nullptr ? : resultSet->Close();
1551     dataShareHelper->Release();
1552     return alarmtoneAttrs_;
1553 }
1554 
GetAlarmToneAttrList(const std::shared_ptr<AbilityRuntime::Context> & context)1555 std::vector<std::shared_ptr<ToneAttrs>> SystemSoundManagerImpl::GetAlarmToneAttrList
1556     (const std::shared_ptr<AbilityRuntime::Context> &context)
1557 {
1558     int32_t errCode = 0;
1559     int32_t result = 0;
1560     std::lock_guard<std::mutex> lock(uriMutex_);
1561     alarmtoneAttrsArray_.clear();
1562     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1563     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, alarmtoneAttrsArray_,
1564         "Create dataShare failed, datashare or ringtone library error.");
1565     DataShare::DatashareBusinessError businessError;
1566     DataShare::DataSharePredicates queryPredicates;
1567     queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, to_string(TONE_TYPE_ALARM));
1568     queryPredicates.GreaterThan(RINGTONE_COLUMN_MEDIA_TYPE, to_string(RINGTONE_MEDIA_TYPE_INVALID));
1569     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
1570     errCode = businessError.GetCode();
1571     Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1572     result =  Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1573         "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1574     MEDIA_LOGI("systemsoundmanagerimpl errCode:%{public}d, result :%{public}d ", errCode, result);
1575     if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
1576         dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1577         CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, alarmtoneAttrsArray_,
1578             "Invalid dataShare, datashare or ringtone library error.");
1579         resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1580     }
1581     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1582     CHECK_AND_RETURN_RET_LOG(results != nullptr, alarmtoneAttrsArray_, "query failed, ringtone library error.");
1583     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1584     while (ringtoneAsset != nullptr) {
1585         alarmtoneAttrs_ = std::make_shared<ToneAttrs>(ringtoneAsset->GetTitle(),
1586             ringtoneAsset->GetDisplayName(), ringtoneAsset->GetPath(),
1587             sourceTypeMap_[ringtoneAsset->GetSourceType()], TONE_CATEGORY_ALARM);
1588         alarmtoneAttrsArray_.push_back(alarmtoneAttrs_);
1589         ringtoneAsset = results->GetNextObject();
1590     }
1591     if (alarmtoneAttrsArray_.empty()) {
1592         MEDIA_LOGE("GetAlarmToneAttrList: no alarmtone in the ringtone library!");
1593     }
1594     resultSet == nullptr ? : resultSet->Close();
1595     dataShareHelper->Release();
1596     return alarmtoneAttrsArray_;
1597 }
1598 
OpenAlarmTone(const std::shared_ptr<AbilityRuntime::Context> & context,const std::string & uri)1599 int32_t SystemSoundManagerImpl::OpenAlarmTone(const std::shared_ptr<AbilityRuntime::Context> &context,
1600     const std::string &uri)
1601 {
1602     return OpenToneUri(context, uri, TONE_TYPE_ALARM);
1603 }
1604 
OpenToneUri(const std::shared_ptr<AbilityRuntime::Context> & context,const std::string & uri,int32_t toneType)1605 int32_t SystemSoundManagerImpl::OpenToneUri(const std::shared_ptr<AbilityRuntime::Context> &context,
1606     const std::string &uri, int32_t toneType)
1607 {
1608     std::lock_guard<std::mutex> lock(uriMutex_);
1609     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1610     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR, "Create dataShare failed, datashare or library error.");
1611     DataShare::DatashareBusinessError businessError;
1612     DataShare::DataSharePredicates queryPredicates;
1613     DataShare::DataSharePredicates queryPredicatesByUri;
1614     queryPredicatesByUri.EqualTo(RINGTONE_COLUMN_DATA, uri);
1615     auto resultSetByUri = dataShareHelper->Query(RINGTONEURI, queryPredicatesByUri, COLUMNS, &businessError);
1616     auto resultsByUri = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSetByUri));
1617     unique_ptr<RingtoneAsset> ringtoneAssetByUri = resultsByUri->GetFirstObject();
1618     if (ringtoneAssetByUri == nullptr) {
1619         MEDIA_LOGE("OpenToneUri: tone of uri is not in the ringtone library!");
1620         resultSetByUri == nullptr ? : resultSetByUri->Close();
1621         dataShareHelper->Release();
1622         return ERROR;
1623     }
1624     resultSetByUri == nullptr ? : resultSetByUri->Close();
1625     queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, toneType);
1626     auto resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1627     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1628     CHECK_AND_RETURN_RET_LOG(results != nullptr, ERROR, "query failed, ringtone library error.");
1629     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1630     while ((ringtoneAsset != nullptr) && (uri != ringtoneAsset->GetPath())) {
1631         ringtoneAsset = results->GetNextObject();
1632     }
1633     if (ringtoneAsset != nullptr) {
1634         string uriStr = RINGTONE_PATH_URI + RINGTONE_SLASH_CHAR + to_string(ringtoneAsset->GetId());
1635         Uri ofUri(uriStr);
1636         int32_t fd = dataShareHelper->OpenFile(ofUri, "r");
1637         resultSet == nullptr ? : resultSet->Close();
1638         dataShareHelper->Release();
1639         return fd > 0 ? fd : ERROR;
1640     }
1641     MEDIA_LOGE("OpenTone: tone of uri failed!");
1642     resultSet == nullptr ? : resultSet->Close();
1643     dataShareHelper->Release();
1644     return TYPEERROR;
1645 }
1646 
Close(const int32_t & fd)1647 int32_t SystemSoundManagerImpl::Close(const int32_t &fd)
1648 {
1649     std::lock_guard<std::mutex> lock(uriMutex_);
1650     return close(fd);
1651 }
1652 
AddCustomizedToneByExternalUri(const std::shared_ptr<AbilityRuntime::Context> & context,const std::shared_ptr<ToneAttrs> & toneAttrs,const std::string & externalUri)1653 std::string SystemSoundManagerImpl::AddCustomizedToneByExternalUri(
1654     const std::shared_ptr<AbilityRuntime::Context> &context, const std::shared_ptr<ToneAttrs> &toneAttrs,
1655     const std::string &externalUri)
1656 {
1657     std::string fdHead = "fd://";
1658     std::string srcPath = externalUri;
1659     int32_t srcFd;
1660     if (srcPath.find(fdHead) != std::string::npos) {
1661         StrToInt(srcPath.substr(fdHead.size()), srcFd);
1662     } else {
1663         srcFd = open(srcPath.c_str(), O_RDONLY);
1664     }
1665     if (srcFd < 0) {
1666         MEDIA_LOGE("AddCustomizedTone: fd open error is %{public}s", strerror(errno));
1667         fdHead.clear();
1668         return fdHead;
1669     }
1670     return AddCustomizedToneByFd(context, toneAttrs, srcFd);
1671 }
1672 
AddCustomizedToneByFd(const std::shared_ptr<AbilityRuntime::Context> & context,const std::shared_ptr<ToneAttrs> & toneAttrs,const int32_t & fd)1673 std::string SystemSoundManagerImpl::AddCustomizedToneByFd(const std::shared_ptr<AbilityRuntime::Context> &context,
1674     const std::shared_ptr<ToneAttrs> &toneAttrs, const int32_t &fd)
1675 {
1676     return AddCustomizedToneByFdAndOffset(context, toneAttrs, fd, 0, INT_MAX);
1677 }
1678 
GetCustomizedTone(const std::shared_ptr<ToneAttrs> & toneAttrs)1679 void SystemSoundManagerImpl::GetCustomizedTone(const std::shared_ptr<ToneAttrs> &toneAttrs)
1680 {
1681     displayName_ = toneAttrs->GetFileName();
1682     mimeType_ = "";
1683     for (const auto& type : RINGTONETYPE) {
1684         size_t found = displayName_.find("." + type);
1685         if (found != std::string::npos) {
1686             mimeType_ = type;
1687         }
1688     }
1689     if (mimeType_.empty()) {
1690         mimeType_ = RINGTONE_CONTAINER_TYPE_OGG;
1691         displayName_ = displayName_ + ".ogg";
1692     }
1693 }
1694 
AddCustomizedTone(const std::shared_ptr<DataShare::DataShareHelper> & dataShareHelper,const std::shared_ptr<ToneAttrs> & toneAttrs)1695 int32_t SystemSoundManagerImpl::AddCustomizedTone(const std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper,
1696     const std::shared_ptr<ToneAttrs> &toneAttrs)
1697 {
1698     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR, "Invalid dataShareHelper.");
1699     int32_t category = -1;
1700     category = toneAttrs->GetCategory();
1701     GetCustomizedTone(toneAttrs);
1702     DataShareValuesBucket valuesBucket;
1703     valuesBucket.Put(RINGTONE_COLUMN_DISPLAY_NAME, static_cast<string>(displayName_));
1704     valuesBucket.Put(RINGTONE_COLUMN_TITLE, static_cast<string>(toneAttrs->GetTitle()));
1705     valuesBucket.Put(RINGTONE_COLUMN_MIME_TYPE, static_cast<string>(mimeType_));
1706     valuesBucket.Put(RINGTONE_COLUMN_SOURCE_TYPE, static_cast<int>(SOURCE_TYPE_CUSTOMISED));
1707     switch (category) {
1708         case TONE_CATEGORY_RINGTONE:
1709             toneAttrs->SetUri(RINGTONE_CUSTOMIZED_RINGTONE_PATH + RINGTONE_SLASH_CHAR + displayName_);
1710             valuesBucket.Put(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_RINGTONE));
1711             break;
1712         case TONE_CATEGORY_TEXT_MESSAGE:
1713             toneAttrs->SetUri(RINGTONE_CUSTOMIZED_NOTIFICATIONS_PATH + RINGTONE_SLASH_CHAR + displayName_);
1714             valuesBucket.Put(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_NOTIFICATION));
1715             break;
1716         case TONE_CATEGORY_NOTIFICATION:
1717             toneAttrs->SetUri(RINGTONE_CUSTOMIZED_NOTIFICATIONS_PATH + RINGTONE_SLASH_CHAR + displayName_);
1718             valuesBucket.Put(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_NOTIFICATION));
1719             break;
1720         case TONE_CATEGORY_ALARM:
1721             toneAttrs->SetUri(RINGTONE_CUSTOMIZED_ALARM_PATH + RINGTONE_SLASH_CHAR + displayName_);
1722             valuesBucket.Put(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_ALARM));
1723             break;
1724         case TONE_CATEGORY_CONTACTS:
1725             toneAttrs->SetUri(RINGTONE_CUSTOMIZED_CONTACTS_PATH + RINGTONE_SLASH_CHAR + displayName_);
1726             valuesBucket.Put(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_CONTACTS));
1727             MEDIA_LOGI("displayName : %{public}s", displayName_.c_str());
1728             break;
1729         default:
1730             break;
1731     }
1732     valuesBucket.Put(RINGTONE_COLUMN_DATA, static_cast<string>(toneAttrs->GetUri()));
1733     return dataShareHelper->Insert(RINGTONEURI, valuesBucket);
1734 }
1735 
AddCustomizedToneByFdAndOffset(const std::shared_ptr<AbilityRuntime::Context> & context,const std::shared_ptr<ToneAttrs> & toneAttrs,const int32_t & fd,const int32_t & offset,const int32_t & length)1736 std::string SystemSoundManagerImpl::AddCustomizedToneByFdAndOffset(
1737     const std::shared_ptr<AbilityRuntime::Context> &context, const std::shared_ptr<ToneAttrs> &toneAttrs,
1738     const int32_t &fd, const int32_t &offset, const int32_t &length)
1739 {
1740     std::string result = "TYPEERROR";
1741     if (toneAttrs->GetCustomizedType() != CUSTOMISED) {
1742         MEDIA_LOGE("AddCustomizedTone: the ringtone is not customized!");
1743         return result;
1744     }
1745     std::lock_guard<std::mutex> lock(uriMutex_);
1746     int32_t srcFd = fd;
1747     off_t lseekResult = lseek(srcFd, offset, SEEK_SET);
1748     if (srcFd < 0 || lseekResult == -1) {
1749         MEDIA_LOGE("fd is error");
1750         result.clear();
1751         return result;
1752     }
1753     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1754     if (dataShareHelper == nullptr) {
1755         MEDIA_LOGE("Create dataShare failed, datashare or ringtone library error.");
1756         result.clear();
1757         return result;
1758     }
1759     int32_t sert = AddCustomizedTone(dataShareHelper, toneAttrs);
1760     std::string dstPath = RINGTONE_PATH_URI + RINGTONE_SLASH_CHAR + to_string(sert);
1761     Uri ofUri(dstPath);
1762     int32_t dstFd = dataShareHelper->OpenFile(ofUri, "rw");
1763     if (dstFd < 0) {
1764         MEDIA_LOGE("AddCustomizedTone: open error is %{public}s", strerror(errno));
1765         result.clear();
1766         dataShareHelper->Release();
1767         return result;
1768     }
1769     char buffer[4096];
1770     int32_t len = length;
1771     memset_s(buffer, sizeof(buffer), 0, sizeof(buffer));
1772     int32_t bytesRead = 0;
1773     while ((bytesRead = read(srcFd, buffer, sizeof(buffer))) > 0 && len > 0) {
1774         int32_t bytesWritten = write(dstFd, buffer, (bytesRead < len) ? bytesRead : len);
1775         memset_s(buffer, sizeof(buffer), 0, sizeof(buffer));
1776         len -= bytesWritten;
1777         if (bytesWritten == -1) {
1778             break;
1779         }
1780     }
1781     close(srcFd);
1782     close(dstFd);
1783     dataShareHelper->Release();
1784     return toneAttrs->GetUri();
1785 }
1786 
RemoveCustomizedTone(const std::shared_ptr<AbilityRuntime::Context> & context,const std::string & uri)1787 int32_t SystemSoundManagerImpl::RemoveCustomizedTone(
1788     const std::shared_ptr<AbilityRuntime::Context> &context, const std::string &uri)
1789 {
1790     std::lock_guard<std::mutex> lock(uriMutex_);
1791     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1792     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR,
1793         "Create dataShare failed, datashare or ringtone library error.");
1794     int32_t changedRows = TYPEERROR;
1795     DataShare::DatashareBusinessError businessError;
1796     DataShare::DataSharePredicates queryPredicates;
1797     queryPredicates.EqualTo(RINGTONE_COLUMN_DATA, uri);
1798     auto resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1799     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1800     CHECK_AND_RETURN_RET_LOG(results != nullptr, ERROR, "query failed, ringtone library error.");
1801     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1802     if (ringtoneAsset == nullptr) {
1803         MEDIA_LOGE("RemoveCustomizedTone: tone of uri is not in the ringtone library!");
1804         resultSet == nullptr ? : resultSet->Close();
1805         dataShareHelper->Release();
1806         return ERROR;
1807     }
1808     while ((ringtoneAsset != nullptr) &&
1809         (SOURCE_TYPE_CUSTOMISED != ringtoneAsset->GetSourceType())) {
1810         ringtoneAsset = results->GetNextObject();
1811     }
1812     if (ringtoneAsset != nullptr) {
1813         DataShare::DataSharePredicates deletePredicates;
1814         deletePredicates.SetWhereClause(RINGTONE_COLUMN_TONE_ID + " = ? ");
1815         deletePredicates.SetWhereArgs({to_string(ringtoneAsset->GetId())});
1816         changedRows = dataShareHelper->Delete(RINGTONEURI, deletePredicates);
1817     } else {
1818         MEDIA_LOGE("RemoveCustomizedTone: the ringtone is not customized!");
1819     }
1820     resultSet == nullptr ? : resultSet->Close();
1821     dataShareHelper->Release();
1822     return changedRows;
1823 }
1824 
SetRingerMode(const AudioStandard::AudioRingerMode & ringerMode)1825 int32_t SystemSoundManagerImpl::SetRingerMode(const AudioStandard::AudioRingerMode &ringerMode)
1826 {
1827     ringerMode_.store(ringerMode);
1828     return MSERR_OK;
1829 }
1830 
GetRingerMode() const1831 AudioStandard::AudioRingerMode SystemSoundManagerImpl::GetRingerMode() const
1832 {
1833     return ringerMode_.load();
1834 }
1835 
ConvertToRingtoneType(ToneHapticsType toneHapticsType,RingtoneType & ringtoneType)1836 bool SystemSoundManagerImpl::ConvertToRingtoneType(ToneHapticsType toneHapticsType, RingtoneType &ringtoneType)
1837 {
1838     switch (toneHapticsType) {
1839         case ToneHapticsType::CALL_SIM_CARD_0 :
1840             ringtoneType = RINGTONE_TYPE_SIM_CARD_0;
1841             return true;
1842         case ToneHapticsType::CALL_SIM_CARD_1 :
1843             ringtoneType = RINGTONE_TYPE_SIM_CARD_1;
1844             return true;
1845         default:
1846             return false;
1847     }
1848 }
1849 
ConvertToSystemToneType(ToneHapticsType toneHapticsType,SystemToneType & systemToneType)1850 bool SystemSoundManagerImpl::ConvertToSystemToneType(ToneHapticsType toneHapticsType, SystemToneType &systemToneType)
1851 {
1852     switch (toneHapticsType) {
1853         case ToneHapticsType::TEXT_MESSAGE_SIM_CARD_0 :
1854             systemToneType = SYSTEM_TONE_TYPE_SIM_CARD_0;
1855             return true;
1856         case ToneHapticsType::TEXT_MESSAGE_SIM_CARD_1 :
1857             systemToneType = SYSTEM_TONE_TYPE_SIM_CARD_1;
1858             return true;
1859         case ToneHapticsType::NOTIFICATION :
1860             systemToneType = SYSTEM_TONE_TYPE_NOTIFICATION;
1861             return true;
1862         default:
1863             return false;
1864     }
1865 }
1866 
IntToToneHapticsMode(int32_t value)1867 ToneHapticsMode SystemSoundManagerImpl::IntToToneHapticsMode(int32_t value)
1868 {
1869     switch (value) {
1870         case NONE:
1871             return NONE;
1872         case SYNC:
1873             return SYNC;
1874         case NON_SYNC:
1875             return NON_SYNC;
1876         default:
1877             return NONE;
1878     }
1879 }
1880 
GetCurrentToneUri(const std::shared_ptr<AbilityRuntime::Context> & context,ToneHapticsType toneHapticsType)1881 std::string SystemSoundManagerImpl::GetCurrentToneUri(const std::shared_ptr<AbilityRuntime::Context> &context,
1882     ToneHapticsType toneHapticsType)
1883 {
1884     string currentToneUri = "";
1885     RingtoneType ringtoneType;
1886     SystemToneType systemToneType;
1887     if (ConvertToRingtoneType(toneHapticsType, ringtoneType)) {
1888         currentToneUri = GetRingtoneUri(context, ringtoneType);
1889     } else if (ConvertToSystemToneType(toneHapticsType, systemToneType)) {
1890         currentToneUri = GetSystemToneUri(context, systemToneType);
1891     } else {
1892         MEDIA_LOGE("Invalid tone haptics type");
1893     }
1894     return currentToneUri;
1895 }
1896 
1897 
UpdateToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & toneUri,ToneHapticsType toneHapticsType,const ToneHapticsSettings & settings)1898 int32_t SystemSoundManagerImpl::UpdateToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
1899     const std::string &toneUri, ToneHapticsType toneHapticsType, const ToneHapticsSettings &settings)
1900 {
1901     MEDIA_LOGI("UpdateToneHapticsSettings: update haptics settings, toneUri[%{public}s] type[%{public}d],"
1902         "mode[%{public}d] hapticsUri[%{public}s]", toneUri.c_str(), toneHapticsType, settings.mode,
1903         settings.hapticsUri.c_str());
1904     DataShare::DataSharePredicates queryPredicates;
1905     queryPredicates.EqualTo(SIMCARD_SETTING_COLUMN_MODE, hapticsTypeWhereArgsMap_[toneHapticsType].first);
1906     queryPredicates.And();
1907     queryPredicates.EqualTo(SIMCARD_SETTING_COLUMN_RINGTONE_TYPE, hapticsTypeWhereArgsMap_[toneHapticsType].second);
1908 
1909     DataShareValuesBucket valuesBucket;
1910     valuesBucket.Put(SIMCARD_SETTING_COLUMN_TONE_FILE, toneUri);
1911     valuesBucket.Put(SIMCARD_SETTING_COLUMN_VIBRATE_FILE, settings.hapticsUri);
1912     valuesBucket.Put(SIMCARD_SETTING_COLUMN_RING_MODE, to_string(hapticsModeMap_[settings.mode]));
1913     valuesBucket.Put(SIMCARD_SETTING_COLUMN_VIBRATE_MODE, to_string(VIBRATE_TYPE_STANDARD));
1914 
1915     int32_t result = dataShareHelper->Update(SIMCARDSETTINGURI, queryPredicates, valuesBucket);
1916     if (result > 0) {
1917         return SUCCESS;
1918     } else {
1919         MEDIA_LOGE("UpdateToneHapticsSettings: update haptics settings fail");
1920     }
1921 
1922     valuesBucket.Put(SIMCARD_SETTING_COLUMN_MODE, to_string(hapticsTypeWhereArgsMap_[toneHapticsType].first));
1923     valuesBucket.Put(SIMCARD_SETTING_COLUMN_RINGTONE_TYPE,
1924         to_string(hapticsTypeWhereArgsMap_[toneHapticsType].second));
1925     result = dataShareHelper->Insert(SIMCARDSETTINGURI, valuesBucket);
1926     if (result <= 0) {
1927         MEDIA_LOGE("UpdateToneHapticsSettings: insert haptics settings fail");
1928     }
1929     return result > 0 ? SUCCESS : IO_ERROR;
1930 }
1931 
GetSimcardSettingAssetByToneHapticsType(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,ToneHapticsType toneHapticsType)1932 std::unique_ptr<SimcardSettingAsset> SystemSoundManagerImpl::GetSimcardSettingAssetByToneHapticsType(
1933     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, ToneHapticsType toneHapticsType)
1934 {
1935     DataShare::DatashareBusinessError businessError;
1936     DataShare::DataSharePredicates queryPredicates;
1937     queryPredicates.EqualTo(SIMCARD_SETTING_COLUMN_MODE, hapticsTypeWhereArgsMap_[toneHapticsType].first);
1938     queryPredicates.And();
1939     queryPredicates.EqualTo(SIMCARD_SETTING_COLUMN_RINGTONE_TYPE, hapticsTypeWhereArgsMap_[toneHapticsType].second);
1940     auto resultSet = dataShareHelper->Query(SIMCARDSETTINGURI, queryPredicates, SETTING_TABLE_COLUMNS,
1941         &businessError);
1942     auto results = make_unique<RingtoneFetchResult<SimcardSettingAsset>>(move(resultSet));
1943     unique_ptr<SimcardSettingAsset> simcardSettingAsset = results->GetFirstObject();
1944     return simcardSettingAsset;
1945 }
1946 
GetToneSyncedHapticsUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & toneUri)1947 std::string SystemSoundManagerImpl::GetToneSyncedHapticsUri(
1948     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, const std::string &toneUri)
1949 {
1950     std::shared_ptr<ToneHapticsAttrs> toneHapticsAttrs;
1951     int32_t result = GetHapticsAttrsSyncedWithTone(toneUri, dataShareHelper, toneHapticsAttrs);
1952     if (result == SUCCESS && toneHapticsAttrs) {
1953         return toneHapticsAttrs->GetUri();
1954     }
1955     return "";
1956 }
1957 
GetDefaultNonSyncedHapticsUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,ToneHapticsType toneHapticsType)1958 std::string SystemSoundManagerImpl::GetDefaultNonSyncedHapticsUri(
1959     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, ToneHapticsType toneHapticsType)
1960 {
1961     MEDIA_LOGD("GetDefaultNonSyncedHapticsUri: toneHapticsType %{public}d", toneHapticsType);
1962     auto toneHapticsItem = defaultToneHapticsUriMap_.find(toneHapticsType);
1963     if (toneHapticsItem == defaultToneHapticsUriMap_.end()) {
1964         MEDIA_LOGE("GetDefaultNonSyncedHapticsUri: get type %{public}d defaultTone haptics fail", toneHapticsType);
1965         return "";
1966     }
1967 
1968     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, "",
1969         "Create dataShare failed, datashare or ringtone library error.");
1970 
1971     DataShare::DatashareBusinessError businessError;
1972     DataShare::DataSharePredicates queryPredicatesByUri;
1973     queryPredicatesByUri.EqualTo(VIBRATE_COLUMN_DISPLAY_NAME, toneHapticsItem->second);
1974     queryPredicatesByUri.And();
1975     queryPredicatesByUri.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE, VIBRATE_TYPE_STANDARD);
1976     auto resultSetByUri = dataShareHelper->Query(VIBRATEURI, queryPredicatesByUri, VIBRATE_TABLE_COLUMNS,
1977         &businessError);
1978     auto resultsByUri = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSetByUri));
1979     unique_ptr<VibrateAsset> vibrateAssetByUri = resultsByUri->GetFirstObject();
1980     if (vibrateAssetByUri == nullptr) {
1981         MEDIA_LOGE("GetDefaultNonSyncedHapticsUri: no non_sync vibration called %{public}s",
1982             toneHapticsItem->second.c_str());
1983         return "";
1984     }
1985 
1986     string hapticsUri = vibrateAssetByUri->GetPath();
1987     MEDIA_LOGI("GetDefaultNonSyncedHapticsUri: toneHapticsType %{public}d default haptics %{public}s",
1988         toneHapticsType, hapticsUri.c_str());
1989     return hapticsUri;
1990 }
1991 
GetFirstNonSyncedHapticsUri()1992 std::string SystemSoundManagerImpl::GetFirstNonSyncedHapticsUri()
1993 {
1994     std::vector<std::shared_ptr<ToneHapticsAttrs>> toneHapticsAttrsArray;
1995     int32_t result = GetToneHapticsList(nullptr, false, toneHapticsAttrsArray);
1996     if (result == SUCCESS && !toneHapticsAttrsArray.empty()) {
1997         return toneHapticsAttrsArray[0]->GetUri();
1998     }
1999     return "";
2000 }
2001 
GetDefaultToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & currentToneUri,ToneHapticsType toneHapticsType,ToneHapticsSettings & settings)2002 int32_t SystemSoundManagerImpl::GetDefaultToneHapticsSettings(
2003     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, const std::string &currentToneUri,
2004     ToneHapticsType toneHapticsType, ToneHapticsSettings &settings)
2005 {
2006     settings.hapticsUri = GetToneSyncedHapticsUri(dataShareHelper, currentToneUri);
2007     if (!settings.hapticsUri.empty()) {
2008         settings.mode = ToneHapticsMode::SYNC;
2009         return SUCCESS;
2010     }
2011     settings.hapticsUri = GetDefaultNonSyncedHapticsUri(dataShareHelper, toneHapticsType);
2012     if (!settings.hapticsUri.empty()) {
2013         settings.mode = ToneHapticsMode::NON_SYNC;
2014         return SUCCESS;
2015     }
2016     settings.hapticsUri = GetFirstNonSyncedHapticsUri();
2017     if (!settings.hapticsUri.empty()) {
2018         settings.mode = ToneHapticsMode::NON_SYNC;
2019         return SUCCESS;
2020     }
2021     return IO_ERROR;
2022 }
2023 
GetToneHapticsSettings(const std::shared_ptr<AbilityRuntime::Context> & context,ToneHapticsType toneHapticsType,ToneHapticsSettings & settings)2024 int32_t SystemSoundManagerImpl::GetToneHapticsSettings(const std::shared_ptr<AbilityRuntime::Context> &context,
2025     ToneHapticsType toneHapticsType, ToneHapticsSettings &settings)
2026 {
2027 #ifdef SUPPORT_VIBRATOR
2028     CHECK_AND_RETURN_RET_LOG(IsToneHapticsTypeValid(toneHapticsType), IO_ERROR, "Invalid tone haptics type");
2029     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2030     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR,
2031         "Create dataShare failed, datashare or ringtone library error.");
2032     string currentToneUri = GetCurrentToneUri(context, toneHapticsType);
2033 
2034     int32_t result = GetToneHapticsSettings(dataShareHelper, currentToneUri, toneHapticsType, settings);
2035     dataShareHelper->Release();
2036     return result;
2037 #endif
2038     return UNSUPPORTED_ERROR;
2039 }
2040 
GetToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & toneUri,ToneHapticsType toneHapticsType,ToneHapticsSettings & settings)2041 int32_t SystemSoundManagerImpl::GetToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
2042     const std::string &toneUri, ToneHapticsType toneHapticsType, ToneHapticsSettings &settings)
2043 {
2044 #ifdef SUPPORT_VIBRATOR
2045     std::lock_guard<std::mutex> lock(toneHapticsMutex_);
2046     MEDIA_LOGI("GetToneHapticsSettings: toneUri %{public}s toneHapticsType %{public}d", toneUri.c_str(),
2047         toneHapticsType);
2048     if (dataShareHelper == nullptr || toneUri.empty() || !IsToneHapticsTypeValid(toneHapticsType)) {
2049         MEDIA_LOGE("GetToneHapticsSettings: param fail");
2050         return IO_ERROR;
2051     }
2052 
2053     int32_t result = SUCCESS;
2054     auto simcardSettingAsset = GetSimcardSettingAssetByToneHapticsType(dataShareHelper, toneHapticsType);
2055     if (simcardSettingAsset == nullptr || simcardSettingAsset->GetToneFile().empty()) {
2056         result = GetDefaultToneHapticsSettings(dataShareHelper, toneUri, toneHapticsType, settings);
2057         if (result != SUCCESS) {
2058             MEDIA_LOGE("GetToneHapticsSettings: get defaultTone haptics settings fail");
2059         }
2060         return result;
2061     }
2062 
2063     if (toneUri == simcardSettingAsset->GetToneFile()) {
2064         settings.hapticsUri = simcardSettingAsset->GetVibrateFile();
2065         settings.mode = IntToToneHapticsMode(simcardSettingAsset->GetRingMode());
2066         return SUCCESS;
2067     }
2068 
2069     if (simcardSettingAsset->GetRingMode() != VIBRATE_PLAYMODE_SYNC) {
2070         settings.hapticsUri = simcardSettingAsset->GetVibrateFile();
2071         settings.mode = IntToToneHapticsMode(simcardSettingAsset->GetRingMode());
2072     } else {
2073         result = GetDefaultToneHapticsSettings(dataShareHelper, toneUri, toneHapticsType, settings);
2074     }
2075     if (result == SUCCESS) {
2076         result = UpdateToneHapticsSettings(dataShareHelper, toneUri, toneHapticsType, settings);
2077     } else {
2078         MEDIA_LOGE("GetToneHapticsSettings: get defaultTone haptics settings fail");
2079     }
2080     return result;
2081 #endif
2082     return UNSUPPORTED_ERROR;
2083 }
2084 
SetToneHapticsSettings(const std::shared_ptr<AbilityRuntime::Context> & context,ToneHapticsType toneHapticsType,const ToneHapticsSettings & settings)2085 int32_t SystemSoundManagerImpl::SetToneHapticsSettings(const std::shared_ptr<AbilityRuntime::Context> &context,
2086     ToneHapticsType toneHapticsType, const ToneHapticsSettings &settings)
2087 {
2088 #ifdef SUPPORT_VIBRATOR
2089     CHECK_AND_RETURN_RET_LOG(IsToneHapticsTypeValid(toneHapticsType), OPERATION_ERROR, "Invalid tone haptics type");
2090     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2091     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR,
2092         "Create dataShare failed, datashare or ringtone library error.");
2093     string currentToneUri = GetCurrentToneUri(context, toneHapticsType);
2094 
2095     int32_t res = SetToneHapticsSettings(dataShareHelper, currentToneUri, toneHapticsType, settings);
2096     dataShareHelper->Release();
2097     return res;
2098 #endif
2099     return UNSUPPORTED_ERROR;
2100 }
2101 
SetToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & toneUri,ToneHapticsType toneHapticsType,const ToneHapticsSettings & settings)2102 int32_t SystemSoundManagerImpl::SetToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
2103     const std::string &toneUri, ToneHapticsType toneHapticsType, const ToneHapticsSettings &settings)
2104 {
2105 #ifdef SUPPORT_VIBRATOR
2106     std::lock_guard<std::mutex> lock(toneHapticsMutex_);
2107     MEDIA_LOGI("SetToneHapticsSettings: toneUri %{public}s type %{public}d hapticsUri %{public}s mode %{public}d",
2108         toneUri.c_str(), toneHapticsType, settings.hapticsUri.c_str(), settings.mode);
2109     if (dataShareHelper == nullptr || toneUri.empty() || !IsToneHapticsTypeValid(toneHapticsType)) {
2110         MEDIA_LOGE("SetToneHapticsSettings: param fail");
2111         return IO_ERROR;
2112     }
2113 
2114     ToneHapticsSettings updateSettings = settings;
2115     if (updateSettings.mode == ToneHapticsMode::NON_SYNC) {
2116         DataShare::DatashareBusinessError businessError;
2117         DataShare::DataSharePredicates queryPredicatesByUri;
2118         queryPredicatesByUri.EqualTo(VIBRATE_COLUMN_DATA, updateSettings.hapticsUri);
2119         queryPredicatesByUri.And();
2120         queryPredicatesByUri.EqualTo(VIBRATE_COLUMN_PLAY_MODE, hapticsModeMap_[updateSettings.mode]);
2121         auto resultSetByUri = dataShareHelper->Query(VIBRATEURI, queryPredicatesByUri, VIBRATE_TABLE_COLUMNS,
2122             &businessError);
2123         auto resultsByUri = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSetByUri));
2124         unique_ptr<VibrateAsset> vibrateAssetByUri = resultsByUri->GetFirstObject();
2125         if (vibrateAssetByUri == nullptr) {
2126             MEDIA_LOGE("SetToneHapticsSettings: vibration of uri is not in the ringtone library!");
2127             return OPERATION_ERROR;
2128         }
2129     } else if (settings.mode == ToneHapticsMode::SYNC) {
2130         std::shared_ptr<ToneHapticsAttrs> toneHapticsAttrs;
2131         int32_t result = GetHapticsAttrsSyncedWithTone(toneUri, dataShareHelper, toneHapticsAttrs);
2132         if (result != SUCCESS) {
2133             MEDIA_LOGE("SetToneHapticsSettings: current tone does not support sync vibration!");
2134             return result;
2135         }
2136         updateSettings.hapticsUri = toneHapticsAttrs->GetUri();
2137     }
2138 
2139     int32_t res = UpdateToneHapticsSettings(dataShareHelper, toneUri, toneHapticsType, updateSettings);
2140     if (res != SUCCESS) {
2141         MEDIA_LOGE("SetToneHapticsSettings: set tone haptics settings fail!");
2142     }
2143     return res;
2144 #endif
2145     return UNSUPPORTED_ERROR;
2146 }
2147 
GetToneHapticsList(const std::shared_ptr<AbilityRuntime::Context> & context,bool isSynced,std::vector<std::shared_ptr<ToneHapticsAttrs>> & toneHapticsAttrsArray)2148 int32_t SystemSoundManagerImpl::GetToneHapticsList(const std::shared_ptr<AbilityRuntime::Context> &context,
2149     bool isSynced, std::vector<std::shared_ptr<ToneHapticsAttrs>> &toneHapticsAttrsArray)
2150 {
2151 #ifdef SUPPORT_VIBRATOR
2152     MEDIA_LOGI("GetToneHapticsList: get vibration list, type : %{public}s.", isSynced ? "sync" : "non sync");
2153     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2154     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR,
2155         "Create dataShare failed, datashare or ringtone library error.");
2156 
2157     DataShare::DatashareBusinessError businessError;
2158     DataShare::DataSharePredicates queryPredicates;
2159     queryPredicates.BeginWrap();
2160     queryPredicates.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE, VIBRATE_TYPE_STANDARD);
2161     queryPredicates.Or();
2162     queryPredicates.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE, VIBRATE_TYPE_SALARM);
2163     queryPredicates.Or();
2164     queryPredicates.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE, VIBRATE_TYPE_SRINGTONE);
2165     queryPredicates.Or();
2166     queryPredicates.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE, VIBRATE_TYPE_SNOTIFICATION);
2167     queryPredicates.EndWrap();
2168     queryPredicates.And();
2169     queryPredicates.EqualTo(VIBRATE_COLUMN_PLAY_MODE,
2170         std::to_string(isSynced ? VIBRATE_PLAYMODE_SYNC : VIBRATE_PLAYMODE_CLASSIC));
2171     auto resultSet = dataShareHelper->Query(VIBRATEURI, queryPredicates, VIBRATE_TABLE_COLUMNS, &businessError);
2172     auto results = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSet));
2173 
2174     toneHapticsAttrsArray.clear();
2175     unique_ptr<VibrateAsset> vibrateAsset = results->GetFirstObject();
2176     if (vibrateAsset == nullptr) {
2177         MEDIA_LOGE("GetToneHapticsList: get %{public}s vibration list fail!", isSynced ? "sync" : "non sync");
2178     } else {
2179         while (vibrateAsset != nullptr) {
2180             auto toneHapticsAttrs = std::make_shared<ToneHapticsAttrs>(vibrateAsset->GetTitle(),
2181                 vibrateAsset->GetDisplayName(), vibrateAsset->GetPath());
2182             toneHapticsAttrsArray.push_back(toneHapticsAttrs);
2183             vibrateAsset = results->GetNextObject();
2184         }
2185     }
2186 
2187     dataShareHelper->Release();
2188     return toneHapticsAttrsArray.empty() ? IO_ERROR : SUCCESS;
2189 #endif
2190     return UNSUPPORTED_ERROR;
2191 }
2192 
ConvertToHapticsFileName(const std::string & fileName)2193 std::string SystemSoundManagerImpl::ConvertToHapticsFileName(const std::string &fileName)
2194 {
2195     size_t dotPos = fileName.find_last_of('.');
2196     if (dotPos != std::string::npos) {
2197         std::string baseName = fileName.substr(0, dotPos);
2198         return baseName + ".json";
2199     } else {
2200         return fileName + ".json";
2201     }
2202 }
2203 
IsPresetRingtone(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & toneUri)2204 std::unique_ptr<RingtoneAsset> SystemSoundManagerImpl::IsPresetRingtone(
2205     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, const std::string &toneUri)
2206 {
2207     DataShare::DatashareBusinessError businessError;
2208     DataShare::DataSharePredicates queryPredicates;
2209     queryPredicates.EqualTo(RINGTONE_COLUMN_DATA, toneUri);
2210     auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
2211     auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
2212     unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
2213     if (ringtoneAsset == nullptr) {
2214         MEDIA_LOGE("IsPresetRingtone: toneUri[%{public}s] inexistence in the ringtone library!", toneUri.c_str());
2215         return nullptr;
2216     }
2217     if (ringtoneAsset->GetSourceType() != SOURCE_TYPE_PRESET) {
2218         MEDIA_LOGE("IsPresetRingtone: toneUri[%{public}s] is not system prefabrication!", toneUri.c_str());
2219         return nullptr;
2220     }
2221     return ringtoneAsset;
2222 }
2223 
GetStandardVibrateType(int toneType)2224 int SystemSoundManagerImpl::GetStandardVibrateType(int toneType)
2225 {
2226     switch (toneType) {
2227         case TONE_TYPE_ALARM:
2228             return VIBRATE_TYPE_SALARM;
2229         case TONE_TYPE_RINGTONE:
2230             return VIBRATE_TYPE_SRINGTONE;
2231         case TONE_TYPE_NOTIFICATION:
2232             return VIBRATE_TYPE_SNOTIFICATION;
2233         default:
2234             return VIBRATE_TYPE_STANDARD;
2235     }
2236 }
2237 
GetHapticsAttrsSyncedWithTone(const std::shared_ptr<AbilityRuntime::Context> & context,const std::string & toneUri,std::shared_ptr<ToneHapticsAttrs> & toneHapticsAttrs)2238 int32_t SystemSoundManagerImpl::GetHapticsAttrsSyncedWithTone(const std::shared_ptr<AbilityRuntime::Context> &context,
2239     const std::string &toneUri, std::shared_ptr<ToneHapticsAttrs> &toneHapticsAttrs)
2240 {
2241 #ifdef SUPPORT_VIBRATOR
2242     CHECK_AND_RETURN_RET_LOG(!toneUri.empty(), OPERATION_ERROR, "Invalid toneUri");
2243     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2244     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR,
2245         "Create dataShare failed, datashare or ringtone library error.");
2246 
2247     int32_t result = GetHapticsAttrsSyncedWithTone(toneUri, dataShareHelper, toneHapticsAttrs);
2248     dataShareHelper->Release();
2249     return result;
2250 #endif
2251     return UNSUPPORTED_ERROR;
2252 }
2253 
GetHapticsAttrsSyncedWithTone(const std::string & toneUri,std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,std::shared_ptr<ToneHapticsAttrs> & toneHapticsAttrs)2254 int32_t SystemSoundManagerImpl::GetHapticsAttrsSyncedWithTone(const std::string &toneUri,
2255     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, std::shared_ptr<ToneHapticsAttrs> &toneHapticsAttrs)
2256 {
2257 #ifdef SUPPORT_VIBRATOR
2258     MEDIA_LOGI("GetHapticsAttrsSyncedWithTone: get %{public}s sync vibration.", toneUri.c_str());
2259     if (dataShareHelper == nullptr || toneUri.empty()) {
2260         MEDIA_LOGE("GetHapticsAttrsSyncedWithTone: param fail");
2261         return IO_ERROR;
2262     }
2263 
2264     unique_ptr<RingtoneAsset> ringtoneAsset = IsPresetRingtone(dataShareHelper, toneUri);
2265     if (ringtoneAsset == nullptr) {
2266         MEDIA_LOGE("GetHapticsAttrsSyncedWithTone: toneUri[%{public}s] is not presetRingtone!", toneUri.c_str());
2267         return OPERATION_ERROR;
2268     }
2269 
2270     DataShare::DatashareBusinessError businessError;
2271     DataShare::DataSharePredicates vibrateQueryPredicates;
2272     vibrateQueryPredicates.EqualTo(VIBRATE_COLUMN_DISPLAY_NAME,
2273         ConvertToHapticsFileName(ringtoneAsset->GetDisplayName()));
2274     vibrateQueryPredicates.And();
2275     vibrateQueryPredicates.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE,
2276         GetStandardVibrateType(ringtoneAsset->GetToneType()));
2277     vibrateQueryPredicates.And();
2278     vibrateQueryPredicates.EqualTo(VIBRATE_COLUMN_PLAY_MODE, VIBRATE_PLAYMODE_SYNC);
2279     auto vibrateResultSet = dataShareHelper->Query(VIBRATEURI, vibrateQueryPredicates, VIBRATE_TABLE_COLUMNS,
2280         &businessError);
2281     auto vibrateResults = make_unique<RingtoneFetchResult<VibrateAsset>>(move(vibrateResultSet));
2282 
2283     unique_ptr<VibrateAsset> vibrateAsset = vibrateResults->GetFirstObject();
2284     if (vibrateAsset == nullptr) {
2285         MEDIA_LOGE("GetHapticsAttrsSyncedWithTone: toneUri[%{public}s] is not sync vibration!", toneUri.c_str());
2286         return IO_ERROR;
2287     }
2288 
2289     toneHapticsAttrs = std::make_shared<ToneHapticsAttrs>(vibrateAsset->GetTitle(), vibrateAsset->GetDisplayName(),
2290         vibrateAsset->GetPath());
2291     return SUCCESS;
2292 #endif
2293     return UNSUPPORTED_ERROR;
2294 }
2295 
OpenToneHaptics(const std::shared_ptr<AbilityRuntime::Context> & context,const std::string & hapticsUri)2296 int32_t SystemSoundManagerImpl::OpenToneHaptics(const std::shared_ptr<AbilityRuntime::Context> &context,
2297     const std::string &hapticsUri)
2298 {
2299 #ifdef SUPPORT_VIBRATOR
2300     CHECK_AND_RETURN_RET_LOG(!hapticsUri.empty(), OPERATION_ERROR, "Invalid hapticsUri");
2301     MEDIA_LOGI("OpenToneHaptics: open %{public}s vibration.", hapticsUri.c_str());
2302     std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2303     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR,
2304         "Create dataShare failed, datashare or ringtone library error.");
2305 
2306     DataShare::DatashareBusinessError businessError;
2307     DataShare::DataSharePredicates queryPredicatesByUri;
2308     queryPredicatesByUri.EqualTo(VIBRATE_COLUMN_DATA, hapticsUri);
2309     auto resultSetByUri = dataShareHelper->Query(VIBRATEURI, queryPredicatesByUri, VIBRATE_TABLE_COLUMNS,
2310         &businessError);
2311     auto resultsByUri = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSetByUri));
2312     unique_ptr<VibrateAsset> vibrateAssetByUri = resultsByUri->GetFirstObject();
2313     if (vibrateAssetByUri == nullptr) {
2314         MEDIA_LOGE("OpenToneHaptics: vibration of uri is not in the ringtone library!");
2315         dataShareHelper->Release();
2316         return OPERATION_ERROR;
2317     }
2318 
2319     string uriStr = VIBRATE_PATH_URI + RINGTONE_SLASH_CHAR + to_string(vibrateAssetByUri->GetId());
2320     Uri ofUri(uriStr);
2321     int32_t fd = dataShareHelper->OpenFile(ofUri, "r");
2322     dataShareHelper->Release();
2323     return fd > 0 ? fd : IO_ERROR;
2324 #endif
2325     return UNSUPPORTED_ERROR;
2326 }
2327 
GetVibrateTypeByStyle(int standardVibrateType,HapticsStyle hapticsStyle,int & vibrateType)2328 bool SystemSoundManagerImpl::GetVibrateTypeByStyle(int standardVibrateType, HapticsStyle hapticsStyle,
2329     int &vibrateType)
2330 {
2331     auto standardVibrateTypeEntry = hapticsStyleMap_.find(standardVibrateType);
2332     if (standardVibrateTypeEntry == hapticsStyleMap_.end()) {
2333         MEDIA_LOGE("GetVibrateType: input type [%{public}d] is not standardVibrateType!", standardVibrateType);
2334         return false;
2335     }
2336     auto hapticsStyleEntry = standardVibrateTypeEntry->second.find(hapticsStyle);
2337     if (hapticsStyleEntry == standardVibrateTypeEntry->second.end()) {
2338         MEDIA_LOGE("GetVibrateType: not have %{public}d haptics Style", hapticsStyle);
2339         return false;
2340     }
2341     vibrateType = hapticsStyleEntry->second;
2342     MEDIA_LOGI("GetVibrateType: standard %{public}d, style %{public}d, vibrateType %{public}d",
2343         hapticsStyle, hapticsStyle, vibrateType);
2344     return true;
2345 }
2346 
GetHapticsUriByStyle(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & standardHapticsUri,HapticsStyle hapticsStyle)2347 std::string SystemSoundManagerImpl::GetHapticsUriByStyle(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
2348     const std::string &standardHapticsUri, HapticsStyle hapticsStyle)
2349 {
2350     if (dataShareHelper == nullptr || standardHapticsUri.empty()) {
2351         MEDIA_LOGE("GetHapticsUriByStyle: param fail, uri [%{public}s]", standardHapticsUri.c_str());
2352         return "";
2353     }
2354     MEDIA_LOGI("GetHapticsUriByStyle: standardHapticsUri %{public}s, style %{public}d", standardHapticsUri.c_str(),
2355         hapticsStyle);
2356 
2357     DataShare::DatashareBusinessError businessError;
2358     DataShare::DataSharePredicates queryPredicatesByUri;
2359     queryPredicatesByUri.EqualTo(VIBRATE_COLUMN_DATA, standardHapticsUri);
2360     auto resultSetByUri = dataShareHelper->Query(VIBRATEURI, queryPredicatesByUri, VIBRATE_TABLE_COLUMNS,
2361         &businessError);
2362     auto resultsByUri = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSetByUri));
2363     unique_ptr<VibrateAsset> vibrateAssetByUri = resultsByUri->GetFirstObject();
2364     if (vibrateAssetByUri == nullptr) {
2365         MEDIA_LOGE("GetHapticsUriByStyle: vibration of uri is not in the ringtone library!");
2366         return "";
2367     }
2368     int vibrateType = 0;
2369     if (!GetVibrateTypeByStyle(vibrateAssetByUri->GetVibrateType(), hapticsStyle, vibrateType)) {
2370         MEDIA_LOGE("GetHapticsUriByStyle: vibration of uri is not standard vibrate!");
2371         return "";
2372     }
2373 
2374     DataShare::DataSharePredicates queryPredicatesByDisplayName;
2375     queryPredicatesByDisplayName.EqualTo(VIBRATE_COLUMN_DISPLAY_NAME, vibrateAssetByUri->GetDisplayName());
2376     queryPredicatesByDisplayName.And();
2377     queryPredicatesByDisplayName.EqualTo(VIBRATE_COLUMN_PLAY_MODE, vibrateAssetByUri->GetPlayMode());
2378     queryPredicatesByDisplayName.And();
2379     queryPredicatesByDisplayName.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE, vibrateType);
2380     auto resultSetByDisplayName = dataShareHelper->Query(VIBRATEURI_PROXY, queryPredicatesByDisplayName,
2381         VIBRATE_TABLE_COLUMNS, &businessError);
2382     auto resultsByDisplayName = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSetByDisplayName));
2383     unique_ptr<VibrateAsset> vibrateAssetByDisplayName = resultsByDisplayName->GetFirstObject();
2384     if (vibrateAssetByDisplayName == nullptr) {
2385         MEDIA_LOGE("GetHapticsUriByStyle: style %{public}d vibration is not in the ringtone library!", hapticsStyle);
2386         return "";
2387     }
2388     MEDIA_LOGI("GetHapticsUriByStyle: get style %{public}d vibration %{public}s!", hapticsStyle,
2389         vibrateAssetByDisplayName->GetPath().c_str());
2390     return vibrateAssetByDisplayName->GetPath();
2391 }
2392 
SetExtRingtoneUri(const std::string & uri,const std::string & title,int32_t ringType,int32_t toneType,int32_t changedRows)2393 void SystemSoundManagerImpl::SetExtRingtoneUri(const std::string &uri, const std::string &title,
2394     int32_t ringType, int32_t toneType, int32_t changedRows)
2395 {
2396     if (changedRows <= 0) {
2397         MEDIA_LOGE("Failed to Set Uri.");
2398         return;
2399     }
2400 
2401     int32_t ringtoneType = -1;
2402     if (toneType == TONE_TYPE_ALARM) {
2403         ringtoneType = EXT_TYPE_ALARMTONE;
2404     } else if (toneType == TONE_TYPE_RINGTONE) {
2405         ringtoneType = (ringType == RINGTONE_TYPE_SIM_CARD_0) ? EXT_TYPE_RINGTONE_ONE : EXT_TYPE_RINGTONE_TWO;
2406     } else if (toneType == TONE_TYPE_NOTIFICATION) {
2407         ringtoneType = (ringType == SYSTEM_TONE_TYPE_NOTIFICATION) ? EXT_TYPE_NOTIFICATION :
2408             (ringType == SYSTEM_TONE_TYPE_SIM_CARD_0) ? EXT_TYPE_MESSAGETONE_ONE : EXT_TYPE_MESSAGETONE_TWO;
2409     }
2410 
2411     if (ringtoneType < 0) {
2412         MEDIA_LOGE("ringtoneType error.");
2413         return;
2414     }
2415 
2416     (void)SetExtRingToneUri(uri, title, ringtoneType);
2417 }
2418 
SetExtRingToneUri(const std::string & uri,const std::string & title,int32_t toneType)2419 int32_t SystemSoundManagerImpl::SetExtRingToneUri(const std::string &uri, const std::string &title, int32_t toneType)
2420 {
2421     int32_t callingUid = IPCSkeleton::GetCallingUid();
2422     CHECK_AND_RETURN_RET_LOG(callingUid != EXT_PROXY_UID, SUCCESS, "Calling from EXT, not need running.");
2423 
2424     std::string serviceAudio = OHOS::system::GetParameter(EXT_SERVICE_AUDIO, "");
2425     CHECK_AND_RETURN_RET_LOG(serviceAudio != "", ERROR, "The EXT is null.");
2426     MEDIA_LOGI("SetExtRingToneUri: toneType %{public}d, title %{public}s, uri %{public}s",
2427         toneType, title.c_str(), uri.c_str());
2428 
2429     auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
2430     CHECK_AND_RETURN_RET_LOG(samgr != nullptr, ERROR, "SystemAbilityManager init failed.");
2431     sptr<IRemoteObject> object = samgr->CheckSystemAbility(EXT_PROXY_SID);
2432     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERROR, "object is nullptr.");
2433 
2434     MessageParcel data;
2435     MessageParcel reply;
2436     MessageOption option(MessageOption::TF_ASYNC);
2437     CHECK_AND_RETURN_RET_LOG(data.WriteInterfaceToken(Str8ToStr16(serviceAudio)), ERROR, "write desc failed.");
2438     CHECK_AND_RETURN_RET_LOG(data.WriteString(uri), ERROR, "write uri failed.");
2439     CHECK_AND_RETURN_RET_LOG(data.WriteString(title), ERROR, "write title failed.");
2440     CHECK_AND_RETURN_RET_LOG(data.WriteInt32(toneType), ERROR, "write toneType failed.");
2441 
2442     int32_t ret = 0;
2443     ret = object->SendRequest(CMD_SET_EXT_RINGTONE_URI, data, reply, option);
2444     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "request failed, error code:%{public}d", ret);
2445 
2446     ret = reply.ReadInt32();
2447     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "reply failed, error code:%{public}d", ret);
2448     MEDIA_LOGI("SetExtRingToneUri Success.");
2449     return SUCCESS;
2450 }
2451 } // namesapce AudioStandard
2452 } // namespace OHOS
2453