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 ¤tToneUri,
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