1 /*
2 * Copyright (c) 2023-2025 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
20 #include "config_policy_utils.h"
21 #include "file_ex.h"
22 #include "nlohmann/json.hpp"
23 #include <nativetoken_kit.h>
24 #include "access_token.h"
25 #include "accesstoken_kit.h"
26 #include "directory_ex.h"
27 #include "ipc_skeleton.h"
28 #include "tokenid_kit.h"
29 #include "token_setproc.h"
30 #include "ringtone_proxy_uri.h"
31
32 #include "system_sound_log.h"
33 #include "media_errors.h"
34 #include "ringtone_player_impl.h"
35 #include "vibrate_type.h"
36 #include "os_account_manager.h"
37 #include "system_tone_player_impl.h"
38 #include "parameter.h"
39 #include "system_sound_manager_utils.h"
40 #include "string_ex.h"
41 #include "parameters.h"
42
43 using namespace std;
44 using namespace nlohmann;
45 using namespace OHOS::AbilityRuntime;
46 using namespace OHOS::DataShare;
47
48 namespace {
49 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_AUDIO_NAPI, "SystemSoundManagerImpl"};
50 }
51
52 namespace OHOS {
53 namespace Media {
54 const std::string FDHEAD = "fd://";
55 const std::string RING_TONE = "ring_tone";
56 const std::string SYSTEM_TONE = "system_tone";
57 const std::string DEFAULT_SYSTEM_SOUND_PATH = "resource/media/audio/";
58 const std::string DEFAULT_RINGTONE_URI_JSON = "ringtone_incall.json";
59 const std::string DEFAULT_RINGTONE_PATH = "ringtones/";
60 const std::string DEFAULT_SYSTEM_TONE_URI_JSON = "ringtone_sms-notification.json";
61 const std::string DEFAULT_SYSTEM_TONE_PATH = "notifications/";
62 const std::string EXT_SERVICE_AUDIO = "const.mulitimedia.service_audio";
63 const std::string FIX_MP4 = ".mp4";
64 const int STORAGE_MANAGER_MANAGER_ID = 5003;
65 const int UNSUPPORTED_ERROR = -5;
66 const int INVALID_FD = -1;
67 const int32_t NOT_ENOUGH_ROM = -234;
68 const int32_t VIDEOS_NUM_EXCEEDS_SPECIFICATION = -235;
69 const int32_t FILE_EXIST = -17;
70 const int32_t MAX_VECTOR_LENGTH = 1024;
71 const off_t MAX_FILE_SIZE_200M = 200 * 1024 * 1024;
72 const int32_t PARAM1 = 1;
73 const int32_t PARAM2 = 2;
74 #ifdef SUPPORT_VIBRATOR
75 const int OPERATION_ERROR = -4;
76 #endif
77 const int IO_ERROR = -3;
78 const int TYPEERROR = -2;
79 const int ERROR = -1;
80 const int SUCCESS = 0;
81 const int32_t EXT_PROXY_UID = 1000;
82 const int32_t EXT_PROXY_SID = 66849;
83 const int32_t CMD_SET_EXT_RINGTONE_URI = 6;
84
85 enum ExtToneType : int32_t {
86 EXT_TYPE_RINGTONE_ONE = 1,
87 EXT_TYPE_NOTIFICATION = 2,
88 EXT_TYPE_ALARMTONE = 4,
89 EXT_TYPE_RINGTONE_TWO = 8,
90 EXT_TYPE_MESSAGETONE_ONE = 16,
91 EXT_TYPE_MESSAGETONE_TWO = 32,
92 };
93
94 // tone haptics default setting
95 static const char PARAM_HAPTICS_SETTING_RINGTONE_CARD_ONE[] = "const.multimedia.haptics_ringtone_sim_card_0_haptics";
96 static const char PARAM_HAPTICS_SETTING_RINGTONE_CARD_TWO[] = "const.multimedia.haptics_ringtone_sim_card_1_haptics";
97 static const char PARAM_HAPTICS_SETTING_SHOT_CARD_ONE[] = "const.multimedia.haptics_system_tone_sim_card_0_haptics";
98 static const char PARAM_HAPTICS_SETTING_SHOT_CARD_TWO[] = "const.multimedia.haptics_system_tone_sim_card_1_haptics";
99 static const char PARAM_HAPTICS_SETTING_NOTIFICATIONTONE[] = "const.multimedia.notification_tone_haptics";
100 static const int32_t SYSPARA_SIZE = 128;
101
102 const char RINGTONE_PARAMETER_SCANNER_FIRST_KEY[] = "ringtone.scanner.first";
103 const int32_t RINGTONEPARA_SIZE = 64;
104
105 std::shared_ptr<SystemSoundManager> SystemSoundManagerFactory::systemSoundManager_ = nullptr;
106 std::mutex SystemSoundManagerFactory::systemSoundManagerMutex_;
107 std::unordered_map<RingtoneType, RingToneType> ringtoneTypeMap_;
108 std::unordered_map<int32_t, ToneCustomizedType> sourceTypeMap_;
109 std::unordered_map<SystemToneType, int32_t> systemTypeMap_;
110 std::unordered_map<SystemToneType, ShotToneType> shotToneTypeMap_;
111 std::unordered_map<RingtoneType, DefaultSystemToneType> defaultoneTypeMap_;
112 std::unordered_map<SystemToneType, int32_t> defaultsystemTypeMap_;
113 std::unordered_map<ToneHapticsMode, VibratePlayMode> hapticsModeMap_;
114 std::unordered_map<ToneHapticsType, std::pair<int32_t, int32_t>> hapticsTypeWhereArgsMap_;
115 std::unordered_map<int32_t, std::unordered_map<HapticsStyle, int32_t>> hapticsStyleMap_;
116 Uri RINGTONEURI(RINGTONE_PATH_URI);
117 Uri VIBRATEURI(VIBRATE_PATH_URI);
118 Uri SIMCARDSETTINGURI(SIMCARD_SETTING_PATH_URI);
119 vector<string> COLUMNS = {{RINGTONE_COLUMN_TONE_ID}, {RINGTONE_COLUMN_DATA}, {RINGTONE_COLUMN_DISPLAY_NAME},
120 {RINGTONE_COLUMN_TITLE}, {RINGTONE_COLUMN_TONE_TYPE}, {RINGTONE_COLUMN_MEDIA_TYPE}, {RINGTONE_COLUMN_SOURCE_TYPE},
121 {RINGTONE_COLUMN_SHOT_TONE_TYPE}, {RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE}, {RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE},
122 {RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE}, {RINGTONE_COLUMN_RING_TONE_TYPE},
123 {RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE}, {RINGTONE_COLUMN_ALARM_TONE_TYPE},
124 {RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE}, {RINGTONE_COLUMN_MIME_TYPE}};
125 vector<string> JOIN_COLUMNS = {{RINGTONE_TABLE + "." + RINGTONE_COLUMN_TONE_ID}, {RINGTONE_COLUMN_DATA},
126 {RINGTONE_TABLE + "." + RINGTONE_COLUMN_DISPLAY_NAME}, {RINGTONE_COLUMN_TITLE},
127 {RINGTONE_COLUMN_TONE_TYPE}, {RINGTONE_COLUMN_SOURCE_TYPE}, {RINGTONE_COLUMN_SHOT_TONE_TYPE},
128 {RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE}, {RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE},
129 {RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE}, {RINGTONE_TABLE + "." + RINGTONE_COLUMN_RING_TONE_TYPE},
130 {RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE}, {RINGTONE_COLUMN_ALARM_TONE_TYPE},
131 {RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE}};
132 vector<string> SETTING_TABLE_COLUMNS = {{SIMCARD_SETTING_COLUMN_MODE}, {SIMCARD_SETTING_COLUMN_TONE_FILE},
133 {SIMCARD_SETTING_COLUMN_RINGTONE_TYPE}, {SIMCARD_SETTING_COLUMN_VIBRATE_FILE},
134 {SIMCARD_SETTING_COLUMN_VIBRATE_MODE}, {SIMCARD_SETTING_COLUMN_RING_MODE}};
135 vector<string> VIBRATE_TABLE_COLUMNS = {{VIBRATE_COLUMN_VIBRATE_ID}, {VIBRATE_COLUMN_DATA}, {VIBRATE_COLUMN_SIZE},
136 {VIBRATE_COLUMN_DISPLAY_NAME}, {VIBRATE_COLUMN_TITLE}, {VIBRATE_COLUMN_DISPLAY_LANGUAGE},
137 {VIBRATE_COLUMN_VIBRATE_TYPE}, {VIBRATE_COLUMN_SOURCE_TYPE}, {VIBRATE_COLUMN_DATE_ADDED},
138 {VIBRATE_COLUMN_DATE_MODIFIED}, {VIBRATE_COLUMN_DATE_TAKEN}, {VIBRATE_COLUMN_PLAY_MODE}};
139 std::vector<std::string> RINGTONETYPE = {{RINGTONE_CONTAINER_TYPE_MP3}, {RINGTONE_CONTAINER_TYPE_OGG},
140 {RINGTONE_CONTAINER_TYPE_AC3}, {RINGTONE_CONTAINER_TYPE_AAC}, {RINGTONE_CONTAINER_TYPE_FLAC},
141 {RINGTONE_CONTAINER_TYPE_WAV}, {RINGTONE_CONTAINER_TYPE_VIDEO_MP4}, {RINGTONE_CONTAINER_TYPE_3GA},
142 {RINGTONE_CONTAINER_TYPE_A52}, {RINGTONE_CONTAINER_TYPE_AMR}, {RINGTONE_CONTAINER_TYPE_IMY},
143 {RINGTONE_CONTAINER_TYPE_RTTTL}, {RINGTONE_CONTAINER_TYPE_XMF}, {RINGTONE_CONTAINER_TYPE_RTX},
144 {RINGTONE_CONTAINER_TYPE_MXMF}, {RINGTONE_CONTAINER_TYPE_M4A}, {RINGTONE_CONTAINER_TYPE_M4B},
145 {RINGTONE_CONTAINER_TYPE_M4P}, {RINGTONE_CONTAINER_TYPE_F4A}, {RINGTONE_CONTAINER_TYPE_F4B},
146 {RINGTONE_CONTAINER_TYPE_F4P}, {RINGTONE_CONTAINER_TYPE_M3U}, {RINGTONE_CONTAINER_TYPE_SMF},
147 {RINGTONE_CONTAINER_TYPE_MKA}, {RINGTONE_CONTAINER_TYPE_RA}, {RINGTONE_CONTAINER_TYPE_ADTS},
148 {RINGTONE_CONTAINER_TYPE_ADT}, {RINGTONE_CONTAINER_TYPE_SND}, {RINGTONE_CONTAINER_TYPE_MP2},
149 {RINGTONE_CONTAINER_TYPE_MP1}, {RINGTONE_CONTAINER_TYPE_MPA}, {RINGTONE_CONTAINER_TYPE_MPA},
150 {RINGTONE_CONTAINER_TYPE_M4R}};
151
CreateSystemSoundManager()152 std::shared_ptr<SystemSoundManager> SystemSoundManagerFactory::CreateSystemSoundManager()
153 {
154 std::lock_guard<std::mutex> lock(systemSoundManagerMutex_);
155 if (systemSoundManager_ == nullptr) {
156 systemSoundManager_ = std::make_shared<SystemSoundManagerImpl>();
157 }
158 CHECK_AND_RETURN_RET_LOG(systemSoundManager_ != nullptr, nullptr, "Failed to create sound manager object");
159 return systemSoundManager_;
160 }
161
SystemSoundManagerImpl()162 SystemSoundManagerImpl::SystemSoundManagerImpl()
163 {
164 InitDefaultUriMap();
165 InitRingerMode();
166 InitMap();
167 InitDefaultToneHapticsMap();
168 }
169
~SystemSoundManagerImpl()170 SystemSoundManagerImpl::~SystemSoundManagerImpl()
171 {
172 if (audioGroupManager_ != nullptr) {
173 (void)audioGroupManager_->UnsetRingerModeCallback(getpid(), ringerModeCallback_);
174 ringerModeCallback_ = nullptr;
175 audioGroupManager_ = nullptr;
176 }
177 }
178
InitMap(void)179 void SystemSoundManagerImpl::InitMap(void)
180 {
181 ringtoneTypeMap_[RINGTONE_TYPE_SIM_CARD_0] = RING_TONE_TYPE_SIM_CARD_1;
182 ringtoneTypeMap_[RINGTONE_TYPE_SIM_CARD_1] = RING_TONE_TYPE_SIM_CARD_2;
183 sourceTypeMap_[SOURCE_TYPE_PRESET] = PRE_INSTALLED;
184 sourceTypeMap_[SOURCE_TYPE_CUSTOMISED] = CUSTOMISED;
185 systemTypeMap_[SYSTEM_TONE_TYPE_SIM_CARD_0] = SHOT_TONE_TYPE_SIM_CARD_1;
186 systemTypeMap_[SYSTEM_TONE_TYPE_SIM_CARD_1] = SHOT_TONE_TYPE_SIM_CARD_2;
187 systemTypeMap_[SYSTEM_TONE_TYPE_NOTIFICATION] = NOTIFICATION_TONE_TYPE;
188 shotToneTypeMap_[SYSTEM_TONE_TYPE_SIM_CARD_0] = SHOT_TONE_TYPE_SIM_CARD_1;
189 shotToneTypeMap_[SYSTEM_TONE_TYPE_SIM_CARD_1] = SHOT_TONE_TYPE_SIM_CARD_2;
190 defaultoneTypeMap_[RINGTONE_TYPE_SIM_CARD_0] = DEFAULT_RING_TYPE_SIM_CARD_1;
191 defaultoneTypeMap_[RINGTONE_TYPE_SIM_CARD_1] = DEFAULT_RING_TYPE_SIM_CARD_2;
192 defaultsystemTypeMap_[SYSTEM_TONE_TYPE_SIM_CARD_0] = DEFAULT_SHOT_TYPE_SIM_CARD_1;
193 defaultsystemTypeMap_[SYSTEM_TONE_TYPE_SIM_CARD_1] = DEFAULT_SHOT_TYPE_SIM_CARD_2;
194 defaultsystemTypeMap_[SYSTEM_TONE_TYPE_NOTIFICATION] = DEFAULT_NOTIFICATION_TYPE;
195 hapticsModeMap_[NONE] = VIBRATE_PLAYMODE_NONE;
196 hapticsModeMap_[SYNC] = VIBRATE_PLAYMODE_SYNC;
197 hapticsModeMap_[NON_SYNC] = VIBRATE_PLAYMODE_CLASSIC;
198 hapticsTypeWhereArgsMap_ = {
199 {ToneHapticsType::CALL_SIM_CARD_0, {RING_TONE_TYPE_SIM_CARD_1, TONE_SETTING_TYPE_RINGTONE}},
200 {ToneHapticsType::CALL_SIM_CARD_1, {RING_TONE_TYPE_SIM_CARD_2, TONE_SETTING_TYPE_RINGTONE}},
201 {ToneHapticsType::TEXT_MESSAGE_SIM_CARD_0, {RING_TONE_TYPE_SIM_CARD_1, TONE_SETTING_TYPE_SHOT}},
202 {ToneHapticsType::TEXT_MESSAGE_SIM_CARD_1, {RING_TONE_TYPE_SIM_CARD_2, TONE_SETTING_TYPE_SHOT}},
203 {ToneHapticsType::NOTIFICATION, {RING_TONE_TYPE_SIM_CARD_BOTH, TONE_SETTING_TYPE_NOTIFICATION}},
204 };
205 hapticsStyleMap_[VIBRATE_TYPE_STANDARD] = {
206 {HAPTICS_STYLE_GENTLE, VIBRATE_TYPE_GENTLE},
207 };
208 hapticsStyleMap_[VIBRATE_TYPE_SALARM] = {
209 {HAPTICS_STYLE_GENTLE, VIBRATE_TYPE_GALARM},
210 };
211 hapticsStyleMap_[VIBRATE_TYPE_SRINGTONE] = {
212 {HAPTICS_STYLE_GENTLE, VIBRATE_TYPE_GRINGTONE},
213 };
214 hapticsStyleMap_[VIBRATE_TYPE_SNOTIFICATION] = {
215 {HAPTICS_STYLE_GENTLE, VIBRATE_TYPE_GNOTIFICATION},
216 };
217 }
218
InitRingerMode(void)219 void SystemSoundManagerImpl::InitRingerMode(void)
220 {
221 audioGroupManager_ = AudioStandard::AudioSystemManager::GetInstance()->
222 GetGroupManager(AudioStandard::DEFAULT_VOLUME_GROUP_ID);
223 if (audioGroupManager_ == nullptr) {
224 MEDIA_LOGE("InitRingerMode: audioGroupManager_ is nullptr");
225 return;
226 }
227 ringerMode_ = audioGroupManager_->GetRingerMode();
228
229 ringerModeCallback_ = std::make_shared<RingerModeCallbackImpl>(*this);
230 audioGroupManager_->SetRingerModeCallback(getpid(), ringerModeCallback_);
231 }
232
IsRingtoneTypeValid(RingtoneType ringtongType)233 bool SystemSoundManagerImpl::IsRingtoneTypeValid(RingtoneType ringtongType)
234 {
235 switch (ringtongType) {
236 case RINGTONE_TYPE_SIM_CARD_0:
237 case RINGTONE_TYPE_SIM_CARD_1:
238 return true;
239 default:
240 MEDIA_LOGE("IsRingtoneTypeValid: ringtongType %{public}d is unavailable", ringtongType);
241 return false;
242 }
243 }
244
IsSystemToneTypeValid(SystemToneType systemToneType)245 bool SystemSoundManagerImpl::IsSystemToneTypeValid(SystemToneType systemToneType)
246 {
247 switch (systemToneType) {
248 case SYSTEM_TONE_TYPE_SIM_CARD_0:
249 case SYSTEM_TONE_TYPE_SIM_CARD_1:
250 case SYSTEM_TONE_TYPE_NOTIFICATION:
251 return true;
252 default:
253 MEDIA_LOGE("IsSystemToneTypeValid: systemToneType %{public}d is unavailable", systemToneType);
254 return false;
255 }
256 }
257
IsSystemToneType(const unique_ptr<RingtoneAsset> & ringtoneAsset,const SystemToneType & systemToneType)258 bool SystemSoundManagerImpl::IsSystemToneType(const unique_ptr<RingtoneAsset> &ringtoneAsset,
259 const SystemToneType &systemToneType)
260 {
261 CHECK_AND_RETURN_RET_LOG(ringtoneAsset != nullptr, false, "Invalid ringtone asset.");
262 return (systemToneType == SYSTEM_TONE_TYPE_NOTIFICATION ?
263 TONE_TYPE_NOTIFICATION != ringtoneAsset->GetToneType() :
264 TONE_TYPE_SHOT != ringtoneAsset->GetToneType());
265 }
266
IsToneHapticsTypeValid(ToneHapticsType toneHapticsType)267 bool SystemSoundManagerImpl::IsToneHapticsTypeValid(ToneHapticsType toneHapticsType)
268 {
269 switch (toneHapticsType) {
270 case ToneHapticsType::CALL_SIM_CARD_0 :
271 case ToneHapticsType::CALL_SIM_CARD_1 :
272 case ToneHapticsType::TEXT_MESSAGE_SIM_CARD_0 :
273 case ToneHapticsType::TEXT_MESSAGE_SIM_CARD_1 :
274 case ToneHapticsType::NOTIFICATION :
275 return true;
276 default:
277 MEDIA_LOGE("IsToneHapticsTypeValid: toneHapticsType %{public}d is unavailable", toneHapticsType);
278 return false;
279 }
280 }
281
InitDefaultUriMap()282 void SystemSoundManagerImpl::InitDefaultUriMap()
283 {
284 systemSoundPath_ = GetFullPath(DEFAULT_SYSTEM_SOUND_PATH);
285
286 std::string ringtoneJsonPath = systemSoundPath_ + DEFAULT_RINGTONE_URI_JSON;
287 InitDefaultRingtoneUriMap(ringtoneJsonPath);
288
289 std::string systemToneJsonPath = systemSoundPath_ + DEFAULT_SYSTEM_TONE_URI_JSON;
290 InitDefaultSystemToneUriMap(systemToneJsonPath);
291 }
292
InitDefaultRingtoneUriMap(const std::string & ringtoneJsonPath)293 void SystemSoundManagerImpl::InitDefaultRingtoneUriMap(const std::string &ringtoneJsonPath)
294 {
295 std::lock_guard<std::mutex> lock(uriMutex_);
296
297 std::string jsonValue = GetJsonValue(ringtoneJsonPath);
298 nlohmann::json ringtoneJson = json::parse(jsonValue, nullptr, false);
299 if (ringtoneJson.is_discarded()) {
300 MEDIA_LOGE("ringtoneJson parsing is false !");
301 return;
302 }
303 if (ringtoneJson.contains("preset_ringtone_sim1") && ringtoneJson["preset_ringtone_sim1"].is_string()) {
304 std::string defaultRingtoneName = ringtoneJson["preset_ringtone_sim1"];
305 defaultRingtoneUriMap_[RINGTONE_TYPE_SIM_CARD_0] =
306 systemSoundPath_ + DEFAULT_RINGTONE_PATH + defaultRingtoneName + ".ogg";
307 MEDIA_LOGI("preset_ringtone_sim1 is [%{public}s]", defaultRingtoneUriMap_[RINGTONE_TYPE_SIM_CARD_0].c_str());
308 } else {
309 defaultRingtoneUriMap_[RINGTONE_TYPE_SIM_CARD_0] = "";
310 MEDIA_LOGW("InitDefaultRingtoneUriMap: failed to load uri of preset_ringtone_sim1");
311 }
312 if (ringtoneJson.contains("preset_ringtone_sim2") && ringtoneJson["preset_ringtone_sim2"].is_string()) {
313 std::string defaultRingtoneName = ringtoneJson["preset_ringtone_sim2"];
314 defaultRingtoneUriMap_[RINGTONE_TYPE_SIM_CARD_1] =
315 systemSoundPath_ + DEFAULT_RINGTONE_PATH + defaultRingtoneName + ".ogg";
316 MEDIA_LOGI("preset_ringtone_sim1 is [%{public}s]", defaultRingtoneUriMap_[RINGTONE_TYPE_SIM_CARD_1].c_str());
317 } else {
318 defaultRingtoneUriMap_[RINGTONE_TYPE_SIM_CARD_1] = "";
319 MEDIA_LOGW("InitDefaultRingtoneUriMap: failed to load uri of preset_ringtone_sim2");
320 }
321 }
322
GetDefaultRingtoneUri(RingtoneType ringtoneType)323 std::string SystemSoundManagerImpl::GetDefaultRingtoneUri(RingtoneType ringtoneType)
324 {
325 std::lock_guard<std::mutex> lock(uriMutex_);
326 if (defaultRingtoneUriMap_.count(ringtoneType) == 0) {
327 MEDIA_LOGE("Failed to GetDefaultRingtoneUri: invalid ringtone type %{public}d", ringtoneType);
328 return "";
329 }
330 return defaultRingtoneUriMap_[ringtoneType];
331 }
332
GetDefaultSystemToneUri(SystemToneType systemToneType)333 std::string SystemSoundManagerImpl::GetDefaultSystemToneUri(SystemToneType systemToneType)
334 {
335 std::lock_guard<std::mutex> lock(uriMutex_);
336 if (defaultSystemToneUriMap_.count(systemToneType) == 0) {
337 MEDIA_LOGE("Failed to GetDefaultRingtoneUri: invalid system tone type %{public}d", systemToneType);
338 return "";
339 }
340 return defaultSystemToneUriMap_[systemToneType];
341 }
342
InitDefaultSystemToneUriMap(const std::string & systemToneJsonPath)343 void SystemSoundManagerImpl::InitDefaultSystemToneUriMap(const std::string &systemToneJsonPath)
344 {
345 std::lock_guard<std::mutex> lock(uriMutex_);
346
347 std::string jsonValue = GetJsonValue(systemToneJsonPath);
348 nlohmann::json systemToneJson = json::parse(jsonValue, nullptr, false);
349 if (systemToneJson.is_discarded()) {
350 MEDIA_LOGE("systemToneJson parsing is false !");
351 return;
352 }
353 if (systemToneJson.contains("preset_ringtone_sms") && systemToneJson["preset_ringtone_sms"].is_string()) {
354 std::string defaultSystemToneName = systemToneJson["preset_ringtone_sms"];
355 defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_SIM_CARD_0] =
356 systemSoundPath_ + DEFAULT_SYSTEM_TONE_PATH + defaultSystemToneName + ".ogg";
357 defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_SIM_CARD_1] =
358 systemSoundPath_ + DEFAULT_SYSTEM_TONE_PATH + defaultSystemToneName + ".ogg";
359 MEDIA_LOGI("preset_ringtone_sms is [%{public}s]",
360 defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_SIM_CARD_0].c_str());
361 } else {
362 defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_SIM_CARD_0] = "";
363 defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_SIM_CARD_1] = "";
364 MEDIA_LOGW("InitDefaultSystemToneUriMap: failed to load uri of preset_ringtone_sms");
365 }
366 if (systemToneJson.contains("preset_ringtone_notification") &&
367 systemToneJson["preset_ringtone_notification"].is_string()) {
368 std::string defaultSystemToneName = systemToneJson["preset_ringtone_notification"];
369 defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_NOTIFICATION] =
370 systemSoundPath_ + DEFAULT_SYSTEM_TONE_PATH + defaultSystemToneName + ".ogg";
371 MEDIA_LOGI("preset_ringtone_notification is [%{public}s]",
372 defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_NOTIFICATION].c_str());
373 } else {
374 defaultSystemToneUriMap_[SYSTEM_TONE_TYPE_NOTIFICATION] = "";
375 MEDIA_LOGW("InitDefaultSystemToneUriMap: failed to load uri of preset_ringtone_notification");
376 }
377 }
378
ReadDefaultToneHaptics(const char * paramName,ToneHapticsType toneHapticsType)379 void SystemSoundManagerImpl::ReadDefaultToneHaptics(const char *paramName, ToneHapticsType toneHapticsType)
380 {
381 char paramValue[SYSPARA_SIZE] = {0};
382 GetParameter(paramName, "", paramValue, SYSPARA_SIZE);
383 if (strcmp(paramValue, "")) {
384 defaultToneHapticsUriMap_.insert(make_pair(toneHapticsType, string(paramValue)));
385 MEDIA_LOGI("ReadDefaultToneHaptics: tone [%{public}d] haptics is [%{public}s]", toneHapticsType, paramValue);
386 } else {
387 MEDIA_LOGW("ReadDefaultToneHaptics: failed to load uri of [%{public}s]", paramName);
388 }
389 }
390
InitDefaultToneHapticsMap()391 void SystemSoundManagerImpl::InitDefaultToneHapticsMap()
392 {
393 ReadDefaultToneHaptics(PARAM_HAPTICS_SETTING_RINGTONE_CARD_ONE, ToneHapticsType::CALL_SIM_CARD_0);
394 ReadDefaultToneHaptics(PARAM_HAPTICS_SETTING_RINGTONE_CARD_TWO, ToneHapticsType::CALL_SIM_CARD_1);
395 ReadDefaultToneHaptics(PARAM_HAPTICS_SETTING_SHOT_CARD_ONE, ToneHapticsType::TEXT_MESSAGE_SIM_CARD_0);
396 ReadDefaultToneHaptics(PARAM_HAPTICS_SETTING_SHOT_CARD_TWO, ToneHapticsType::TEXT_MESSAGE_SIM_CARD_1);
397 ReadDefaultToneHaptics(PARAM_HAPTICS_SETTING_NOTIFICATIONTONE, ToneHapticsType::NOTIFICATION);
398 }
399
GetFullPath(const std::string & originalUri)400 std::string SystemSoundManagerImpl::GetFullPath(const std::string &originalUri)
401 {
402 char buf[MAX_PATH_LEN];
403 char *path = GetOneCfgFile(originalUri.c_str(), buf, MAX_PATH_LEN);
404 if (path == nullptr || *path == '\0') {
405 MEDIA_LOGE("GetOneCfgFile for %{public}s failed.", originalUri.c_str());
406 return "";
407 }
408 std::string filePath = path;
409 MEDIA_LOGI("GetFullPath for [%{public}s], result: [%{public}s]", originalUri.c_str(), filePath.c_str());
410 return filePath;
411 }
412
GetJsonValue(const std::string & jsonPath)413 std::string SystemSoundManagerImpl::GetJsonValue(const std::string &jsonPath)
414 {
415 std::string jsonValue = "";
416 ifstream file(jsonPath.c_str());
417 if (!file.is_open()) {
418 MEDIA_LOGI("file not open! try open first ! ");
419 file.open(jsonPath.c_str(), ios::app);
420 if (!file.is_open()) {
421 MEDIA_LOGE("open file again fail !");
422 return "";
423 }
424 }
425 file.seekg(0, ios::end);
426
427 const long maxFileLength = 32 * 1024 * 1024; // max size of the json file
428 const long fileLength = file.tellg();
429 if (fileLength > maxFileLength) {
430 MEDIA_LOGE("invalid file length(%{public}ld)!", fileLength);
431 return "";
432 }
433
434 jsonValue.clear();
435 file.seekg(0, ios::beg);
436 copy(istreambuf_iterator<char>(file), istreambuf_iterator<char>(), back_inserter(jsonValue));
437 return jsonValue;
438 }
439
WriteUriToDatabase(const std::string & key,const std::string & uri)440 int32_t SystemSoundManagerImpl::WriteUriToDatabase(const std::string &key, const std::string &uri)
441 {
442 int32_t result = AudioStandard::AudioSystemManager::GetInstance()->SetSystemSoundUri(key, uri);
443 MEDIA_LOGI("WriteUriToDatabase: key: %{public}s, uri: %{public}s, result: %{public}d",
444 key.c_str(), uri.c_str(), result);
445 return result;
446 }
447
GetUriFromDatabase(const std::string & key)448 std::string SystemSoundManagerImpl::GetUriFromDatabase(const std::string &key)
449 {
450 std::string uri = AudioStandard::AudioSystemManager::GetInstance()->GetSystemSoundUri(key);
451
452 MEDIA_LOGI("GetUriFromDatabase: key [%{public}s], uri [%{public}s]", key.c_str(), uri.c_str());
453 return uri;
454 }
455
GetKeyForDatabase(const std::string & systemSoundType,int32_t type)456 std::string SystemSoundManagerImpl::GetKeyForDatabase(const std::string &systemSoundType, int32_t type)
457 {
458 if (systemSoundType == RING_TONE) {
459 switch (static_cast<RingtoneType>(type)) {
460 case RINGTONE_TYPE_SIM_CARD_0:
461 return "ringtone_for_sim_card_0";
462 case RINGTONE_TYPE_SIM_CARD_1:
463 return "ringtone_for_sim_card_1";
464 default:
465 MEDIA_LOGE("GetKeyForDatabase: ringtoneType %{public}d is unavailable", type);
466 return "";
467 }
468 } else if (systemSoundType == SYSTEM_TONE) {
469 switch (static_cast<SystemToneType>(type)) {
470 case SYSTEM_TONE_TYPE_SIM_CARD_0:
471 return "system_tone_for_sim_card_0";
472 case SYSTEM_TONE_TYPE_SIM_CARD_1:
473 return "system_tone_for_sim_card_1";
474 case SYSTEM_TONE_TYPE_NOTIFICATION:
475 return "system_tone_for_notification";
476 default:
477 MEDIA_LOGE("GetKeyForDatabase: systemToneType %{public}d is unavailable", type);
478 return "";
479 }
480 } else {
481 MEDIA_LOGE("GetKeyForDatabase: systemSoundType %{public}s is unavailable", systemSoundType.c_str());
482 return "";
483 }
484 }
485
UpdateRingtoneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const int32_t & toneId,RingtoneType ringtoneType,const int32_t & num)486 int32_t SystemSoundManagerImpl::UpdateRingtoneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
487 const int32_t &toneId, RingtoneType ringtoneType, const int32_t &num)
488 {
489 RingToneType type = RING_TONE_TYPE_SIM_CARD_1;
490 DataSharePredicates updateOnlyPredicates;
491 DataShareValuesBucket updateOnlyValuesBucket;
492 updateOnlyPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
493 RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
494 updateOnlyPredicates.SetWhereArgs({to_string(ringtoneTypeMap_[ringtoneType]),
495 to_string(SOURCE_TYPE_CUSTOMISED)});
496 updateOnlyValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_TYPE, RING_TONE_TYPE_NOT);
497 updateOnlyValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
498 dataShareHelper->Update(RINGTONEURI, updateOnlyPredicates, updateOnlyValuesBucket);
499
500 DataSharePredicates updateBothPredicates;
501 DataShareValuesBucket updateBothValuesBucket;
502 if (ringtoneTypeMap_[ringtoneType] == RING_TONE_TYPE_SIM_CARD_1) {
503 type = RING_TONE_TYPE_SIM_CARD_2;
504 }
505 updateBothPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
506 RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
507 updateBothPredicates.SetWhereArgs({to_string(RING_TONE_TYPE_SIM_CARD_BOTH),
508 to_string(SOURCE_TYPE_CUSTOMISED)});
509 updateBothValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_TYPE, type);
510 dataShareHelper->Update(RINGTONEURI, updateBothPredicates, updateBothValuesBucket);
511
512 DataSharePredicates updatePredicates;
513 DataShareValuesBucket updateValuesBucket;
514 if (((num == RING_TONE_TYPE_SIM_CARD_1 || num == RING_TONE_TYPE_SIM_CARD_BOTH) &&
515 (ringtoneTypeMap_[ringtoneType] == RING_TONE_TYPE_SIM_CARD_2)) ||
516 ((num == RING_TONE_TYPE_SIM_CARD_2 || num == RING_TONE_TYPE_SIM_CARD_BOTH) &&
517 (ringtoneTypeMap_[ringtoneType] == RING_TONE_TYPE_SIM_CARD_1))) {
518 type = RING_TONE_TYPE_SIM_CARD_BOTH;
519 } else {
520 type = ringtoneTypeMap_[ringtoneType];
521 }
522 updatePredicates.SetWhereClause(RINGTONE_COLUMN_TONE_ID + " = ? ");
523 updatePredicates.SetWhereArgs({to_string(toneId)});
524 updateValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_TYPE, type);
525 updateValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE, SOURCE_TYPE_CUSTOMISED);
526 return dataShareHelper->Update(RINGTONEURI, updatePredicates, updateValuesBucket);
527 }
528
SetNoRingToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,RingtoneType ringtoneType)529 int32_t SystemSoundManagerImpl::SetNoRingToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
530 RingtoneType ringtoneType)
531 {
532 MEDIA_LOGI("Set no audio uri for system tone type %{public}d", ringtoneType);
533 int32_t result = 0;
534 // Removes the flag for the current system tone uri.
535 result += RemoveSourceTypeForRingTone(dataShareHelper, ringtoneType, SOURCE_TYPE_CUSTOMISED);
536 // Removes the flag for the preset system tone uri.
537 result += RemoveSourceTypeForRingTone(dataShareHelper, ringtoneType, SOURCE_TYPE_PRESET);
538 return result;
539 }
540
RemoveSourceTypeForRingTone(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,RingtoneType ringtoneType,SourceType sourceType)541 int32_t SystemSoundManagerImpl::RemoveSourceTypeForRingTone(
542 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, RingtoneType ringtoneType, SourceType sourceType)
543 {
544 int32_t result = 0;
545 switch (ringtoneType) {
546 case RINGTONE_TYPE_SIM_CARD_0:
547 case RINGTONE_TYPE_SIM_CARD_1: {
548 // SIM_CARD_0 or SIM_CARD_1
549 DataSharePredicates updateOnlyPredicates;
550 DataShareValuesBucket updateOnlyValuesBucket;
551 updateOnlyPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
552 RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
553 updateOnlyPredicates.SetWhereArgs({to_string(ringtoneTypeMap_[ringtoneType]), to_string(sourceType)});
554 updateOnlyValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_TYPE, RING_TONE_TYPE_NOT);
555 updateOnlyValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
556 result += dataShareHelper->Update(RINGTONEURI, updateOnlyPredicates, updateOnlyValuesBucket);
557 // both SIM_CARD_0 and SIM_CARD_1
558 DataSharePredicates updateBothPredicates;
559 DataShareValuesBucket updateBothValuesBucket;
560 RingToneType type = RING_TONE_TYPE_SIM_CARD_1;
561 if (ringtoneTypeMap_[ringtoneType] == RING_TONE_TYPE_SIM_CARD_1) {
562 type = RING_TONE_TYPE_SIM_CARD_2;
563 }
564 updateBothPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
565 RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
566 updateBothPredicates.SetWhereArgs({to_string(RING_TONE_TYPE_SIM_CARD_BOTH), to_string(sourceType)});
567 updateBothValuesBucket.Put(RINGTONE_COLUMN_RING_TONE_TYPE, type);
568 result += dataShareHelper->Update(RINGTONEURI, updateBothPredicates, updateBothValuesBucket);
569 MEDIA_LOGI("The ring0 tone type [%{public}d] is invalid!", ringtoneType);
570 break;
571 }
572 default:
573 MEDIA_LOGE("The ring1 tone type [%{public}d] is invalid!", ringtoneType);
574 break;
575 }
576 return result;
577 }
578
SetRingtoneUri(const shared_ptr<Context> & context,const string & uri,RingtoneType ringtoneType)579 int32_t SystemSoundManagerImpl::SetRingtoneUri(const shared_ptr<Context> &context, const string &uri,
580 RingtoneType ringtoneType)
581 {
582 std::lock_guard<std::mutex> lock(uriMutex_);
583 CHECK_AND_RETURN_RET_LOG(IsRingtoneTypeValid(ringtoneType), MSERR_INVALID_VAL, "Invalid ringtone type");
584
585 MEDIA_LOGI("SetRingtoneUri: ringtoneType %{public}d, uri %{public}s", ringtoneType, uri.c_str());
586 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
587 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
588 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR, "Create dataShare failed, datashare or library error.");
589
590 if (uri == NO_RING_SOUND) {
591 int32_t changedRows = SetNoRingToneUri(dataShareHelper, ringtoneType);
592 MEDIA_LOGI("SetNoRingToneUri result: changedRows %{public}d", changedRows);
593 dataShareHelper->Release();
594 return SUCCESS;
595 }
596
597 DataShare::DatashareBusinessError businessError;
598 DataShare::DataSharePredicates queryPredicates;
599 DataShare::DataSharePredicates queryPredicatesByUri;
600 queryPredicatesByUri.EqualTo(RINGTONE_COLUMN_DATA, uri);
601 auto resultSetByUri = dataShareHelper->Query(RINGTONEURI, queryPredicatesByUri, COLUMNS, &businessError);
602 auto resultsByUri = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSetByUri));
603 unique_ptr<RingtoneAsset> ringtoneAssetByUri = resultsByUri->GetFirstObject();
604 if (ringtoneAssetByUri == nullptr) {
605 resultSetByUri == nullptr ? : resultSetByUri->Close();
606 dataShareHelper->Release();
607 MEDIA_LOGE("Failed to find the uri in ringtone library!");
608 return ERROR;
609 }
610 resultSetByUri == nullptr ? : resultSetByUri->Close();
611 queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, TONE_TYPE_RINGTONE);
612 auto resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
613 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
614 CHECK_AND_RETURN_RET_LOG(results != nullptr, ERROR, "query failed, ringtone library error.");
615 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
616 while ((ringtoneAsset != nullptr) && (uri != ringtoneAsset->GetPath())) {
617 ringtoneAsset = results->GetNextObject();
618 }
619 if (ringtoneAsset != nullptr) {
620 int32_t changedRows = UpdateRingtoneUri(dataShareHelper, ringtoneAsset->GetId(),
621 ringtoneType, ringtoneAsset->GetRingtoneType());
622 resultSet == nullptr ? : resultSet->Close();
623 dataShareHelper->Release();
624 SetExtRingtoneUri(uri, ringtoneAsset->GetTitle(), ringtoneType, TONE_TYPE_RINGTONE, changedRows);
625 return changedRows > 0 ? SUCCESS : ERROR;
626 }
627 resultSet == nullptr ? : resultSet->Close();
628 dataShareHelper->Release();
629 return TYPEERROR;
630 }
631
GetRingtoneUriByType(const DatabaseTool & databaseTool,const std::string & type)632 std::string SystemSoundManagerImpl::GetRingtoneUriByType(const DatabaseTool &databaseTool, const std::string &type)
633 {
634 ToneAttrs toneAttrs = GetRingtoneAttrsByType(databaseTool, type);
635 return toneAttrs.GetUri();
636 }
637
GetRingtoneAttrsByType(const DatabaseTool & databaseTool,const std::string & type)638 ToneAttrs SystemSoundManagerImpl::GetRingtoneAttrsByType(const DatabaseTool &databaseTool, const std::string &type)
639 {
640 ToneAttrs toneAttrs = { "", "", "", CUSTOMISED, TONE_CATEGORY_RINGTONE };
641 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
642 MEDIA_LOGE("GetRingtoneAttrsByType: the database tool is not ready!");
643 return toneAttrs;
644 }
645
646 std::string uri = "";
647 DataShare::DatashareBusinessError businessError;
648 DataShare::DataSharePredicates queryPredicates;
649 queryPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
650 RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
651 queryPredicates.SetWhereArgs({type, to_string(SOURCE_TYPE_CUSTOMISED)});
652
653 std::string ringtoneLibraryUri = "";
654 if (databaseTool.isProxy) {
655 ringtoneLibraryUri = RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES +
656 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
657 } else {
658 ringtoneLibraryUri = RINGTONE_PATH_URI;
659 }
660 Uri queryUri(ringtoneLibraryUri);
661 auto resultSet = databaseTool.dataShareHelper->Query(queryUri, queryPredicates, COLUMNS, &businessError);
662 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
663 if (results == nullptr) {
664 MEDIA_LOGE("GetRingtoneAttrsByType: results is nullptr!");
665 return toneAttrs;
666 }
667 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
668 if (ringtoneAsset != nullptr) {
669 toneAttrs.SetUri(ringtoneAsset->GetPath());
670 toneAttrs.SetTitle(ringtoneAsset->GetTitle());
671 toneAttrs.SetFileName(ringtoneAsset->GetDisplayName());
672 toneAttrs.SetCategory(ringtoneAsset->GetToneType());
673 if (ringtoneAsset->GetMediaType() == RINGTONE_MEDIA_TYPE_VIDEO) {
674 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_VID);
675 } else {
676 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_AUD);
677 }
678 }
679 resultSet == nullptr ? : resultSet->Close();
680 return toneAttrs;
681 }
682
GetPresetRingToneUriByType(const DatabaseTool & databaseTool,const std::string & type)683 std::string SystemSoundManagerImpl::GetPresetRingToneUriByType(const DatabaseTool &databaseTool,
684 const std::string &type)
685 {
686 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
687 MEDIA_LOGE("The database tool is not ready!");
688 return "";
689 }
690
691 std::string uri = "";
692 DataShare::DatashareBusinessError businessError;
693 DataShare::DataSharePredicates queryPredicates;
694 queryPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
695 RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
696 queryPredicates.SetWhereArgs({type, to_string(SOURCE_TYPE_PRESET)});
697
698 std::string ringtoneLibraryUri = "";
699 if (databaseTool.isProxy) {
700 ringtoneLibraryUri = RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES +
701 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
702 } else {
703 ringtoneLibraryUri = RINGTONE_PATH_URI;
704 }
705 Uri queryUri(ringtoneLibraryUri);
706 auto resultSet = databaseTool.dataShareHelper->Query(queryUri, queryPredicates, COLUMNS, &businessError);
707 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
708 CHECK_AND_RETURN_RET_LOG(results != nullptr, uri, "query failed, ringtone library error.");
709 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
710 if (ringtoneAsset != nullptr) {
711 uri = ringtoneAsset->GetPath();
712 }
713 resultSet == nullptr ? : resultSet->Close();
714 return uri;
715 }
716
GetPresetRingToneAttrByType(const DatabaseTool & databaseTool,const std::string & type)717 ToneAttrs SystemSoundManagerImpl::GetPresetRingToneAttrByType(const DatabaseTool &databaseTool,
718 const std::string &type)
719 {
720 ToneAttrs toneAttrs = { "", "", "", CUSTOMISED, TONE_CATEGORY_RINGTONE };
721 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
722 MEDIA_LOGE("GetPresetRingToneAttrByType: The database tool is not ready!");
723 return toneAttrs;
724 }
725
726 std::string uri = "";
727 DataShare::DatashareBusinessError businessError;
728 DataShare::DataSharePredicates queryPredicates;
729 queryPredicates.SetWhereClause(RINGTONE_COLUMN_RING_TONE_TYPE + " = ? AND " +
730 RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE + " = ? ");
731 queryPredicates.SetWhereArgs({type, to_string(SOURCE_TYPE_PRESET)});
732
733 std::string ringtoneLibraryUri = "";
734 if (databaseTool.isProxy) {
735 ringtoneLibraryUri = RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES +
736 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
737 } else {
738 ringtoneLibraryUri = RINGTONE_PATH_URI;
739 }
740 Uri queryUri(ringtoneLibraryUri);
741 auto resultSet = databaseTool.dataShareHelper->Query(queryUri, queryPredicates, COLUMNS, &businessError);
742 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
743 if (results == nullptr) {
744 MEDIA_LOGE("GetPresetRingToneAttrByType: query failed, ringtone library error!");
745 return toneAttrs;
746 }
747 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
748 if (ringtoneAsset != nullptr) {
749 toneAttrs.SetUri(ringtoneAsset->GetPath());
750 toneAttrs.SetTitle(ringtoneAsset->GetTitle());
751 toneAttrs.SetFileName(ringtoneAsset->GetDisplayName());
752 toneAttrs.SetCategory(ringtoneAsset->GetToneType());
753 if (ringtoneAsset->GetMediaType() == RINGTONE_MEDIA_TYPE_VIDEO) {
754 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_VID);
755 } else {
756 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_AUD);
757 }
758 }
759 resultSet == nullptr ? : resultSet->Close();
760 return toneAttrs;
761 }
762
GetRingtoneUri(const shared_ptr<Context> & context,RingtoneType ringtoneType)763 std::string SystemSoundManagerImpl::GetRingtoneUri(const shared_ptr<Context> &context, RingtoneType ringtoneType)
764 {
765 ToneAttrs toneAttrs = GetCurrentRingtoneAttribute(ringtoneType);
766 return toneAttrs.GetUri();
767 }
768
GetCurrentRingtoneAttribute(RingtoneType ringtoneType)769 ToneAttrs SystemSoundManagerImpl::GetCurrentRingtoneAttribute(RingtoneType ringtoneType)
770 {
771 MEDIA_LOGI("GetCurrentRingtoneAttribute: Start, ringtoneType: %{public}d", ringtoneType);
772 ToneAttrs toneAttrs = { "", "", "", CUSTOMISED, TONE_CATEGORY_RINGTONE };
773 if (!IsRingtoneTypeValid(ringtoneType)) {
774 MEDIA_LOGE("GetCurrentRingtoneAttribute: Invalid ringtone type!");
775 return toneAttrs;
776 }
777
778 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
779 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
780 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
781 bool isProxy = (result == Security::AccessToken::PermissionState::PERMISSION_GRANTED &&
782 SystemSoundManagerUtils::GetScannerFirstParameter(RINGTONE_PARAMETER_SCANNER_FIRST_KEY, RINGTONEPARA_SIZE) &&
783 SystemSoundManagerUtils::CheckCurrentUser()) ? true : false;
784 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = isProxy ?
785 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID) :
786 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
787 if (dataShareHelper == nullptr) {
788 MEDIA_LOGE("GetCurrentRingtoneAttribute: Failed to CreateDataShareHelper!");
789 return toneAttrs;
790 }
791 DatabaseTool databaseTool = {true, isProxy, dataShareHelper};
792 toneAttrs = GetRingtoneAttrs(databaseTool, ringtoneType);
793 dataShareHelper->Release();
794 MEDIA_LOGI("Finish to get ringtone attrs: type %{public}d, mediaType %{public}d, uri: %{public}s",
795 ringtoneType, toneAttrs.GetMediaType(), toneAttrs.GetUri().c_str());
796 return toneAttrs;
797 }
798
GetRingtoneUri(const DatabaseTool & databaseTool,RingtoneType ringtoneType)799 std::string SystemSoundManagerImpl::GetRingtoneUri(const DatabaseTool &databaseTool, RingtoneType ringtoneType)
800 {
801 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
802 MEDIA_LOGE("GetRingtoneUri: The database tool is not ready!");
803 return "";
804 }
805
806 std::string ringtoneUri = "";
807 switch (ringtoneType) {
808 case RINGTONE_TYPE_SIM_CARD_0:
809 case RINGTONE_TYPE_SIM_CARD_1:
810 ringtoneUri = GetRingtoneUriByType(databaseTool, to_string(ringtoneTypeMap_[ringtoneType]));
811 if (ringtoneUri.empty()) {
812 ringtoneUri = GetRingtoneUriByType(databaseTool, to_string(RING_TONE_TYPE_SIM_CARD_BOTH));
813 }
814 if (ringtoneUri.empty()) {
815 ringtoneUri = GetPresetRingToneUriByType(databaseTool, to_string(ringtoneTypeMap_[ringtoneType]));
816 }
817 if (ringtoneUri.empty()) {
818 ringtoneUri = GetPresetRingToneUriByType(databaseTool, to_string(RING_TONE_TYPE_SIM_CARD_BOTH));
819 }
820 break;
821 default:
822 break;
823 }
824 if (ringtoneUri.empty()) {
825 MEDIA_LOGI("GetRingtoneUri: No ring tone uri for type %{public}d. Return NO_RING_SOUND", ringtoneType);
826 return NO_RING_SOUND;
827 }
828 return ringtoneUri;
829 }
830
GetRingtoneAttrs(const DatabaseTool & databaseTool,RingtoneType ringtoneType)831 ToneAttrs SystemSoundManagerImpl::GetRingtoneAttrs(const DatabaseTool &databaseTool, RingtoneType ringtoneType)
832 {
833 ToneAttrs toneAttrs = { "", "", "", CUSTOMISED, TONE_CATEGORY_RINGTONE };
834 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
835 MEDIA_LOGE("GetRingtoneAttrs: The database tool is not ready!");
836 return toneAttrs;
837 }
838
839 switch (ringtoneType) {
840 case RINGTONE_TYPE_SIM_CARD_0:
841 case RINGTONE_TYPE_SIM_CARD_1:
842 toneAttrs = GetRingtoneAttrsByType(databaseTool, to_string(ringtoneTypeMap_[ringtoneType]));
843 if (toneAttrs.GetUri().empty()) {
844 toneAttrs = GetRingtoneAttrsByType(databaseTool, to_string(RING_TONE_TYPE_SIM_CARD_BOTH));
845 }
846 if (toneAttrs.GetUri().empty()) {
847 toneAttrs = GetPresetRingToneAttrByType(databaseTool, to_string(ringtoneTypeMap_[ringtoneType]));
848 }
849 if (toneAttrs.GetUri().empty()) {
850 toneAttrs = GetPresetRingToneAttrByType(databaseTool, to_string(RING_TONE_TYPE_SIM_CARD_BOTH));
851 }
852 break;
853 default:
854 break;
855 }
856 if (toneAttrs.GetUri().empty()) {
857 MEDIA_LOGI("GetRingtoneAttrs: No ring tone uri for type %{public}d. Return NO_RING_SOUND", ringtoneType);
858 toneAttrs.SetUri(NO_RING_SOUND);
859 }
860 return toneAttrs;
861 }
862
GetRingtoneTitle(const std::string & ringtoneUri)863 std::string SystemSoundManagerImpl::GetRingtoneTitle(const std::string &ringtoneUri)
864 {
865 std::lock_guard<std::mutex> lock(uriMutex_);
866 std::string ringtoneTitle = "";
867 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
868 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
869 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ringtoneUri,
870 "Create dataShare failed, datashare or ringtone library error.");
871 DataShare::DatashareBusinessError businessError;
872 DataShare::DataSharePredicates queryPredicatesByUri;
873 queryPredicatesByUri.EqualTo(RINGTONE_COLUMN_DATA, ringtoneUri);
874 auto resultSetByUri = dataShareHelper->Query(RINGTONEURI, queryPredicatesByUri, COLUMNS, &businessError);
875 auto resultsByUri = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSetByUri));
876 unique_ptr<RingtoneAsset> ringtoneAssetByUri = resultsByUri->GetFirstObject();
877 if (ringtoneAssetByUri != nullptr) {
878 ringtoneTitle = ringtoneAssetByUri->GetTitle();
879 }
880 resultSetByUri == nullptr ? : resultSetByUri->Close();
881 dataShareHelper->Release();
882 return ringtoneTitle;
883 }
884
GetRingtonePlayer(const shared_ptr<Context> & context,RingtoneType ringtoneType)885 std::shared_ptr<RingtonePlayer> SystemSoundManagerImpl::GetRingtonePlayer(const shared_ptr<Context> &context,
886 RingtoneType ringtoneType)
887 {
888 std::lock_guard<std::mutex> lock(playerMutex_);
889 CHECK_AND_RETURN_RET_LOG(IsRingtoneTypeValid(ringtoneType), nullptr, "invalid ringtone type");
890 MEDIA_LOGI("GetRingtonePlayer: for ringtoneType %{public}d", ringtoneType);
891
892 std::shared_ptr<RingtonePlayer> ringtonePlayer = std::make_shared<RingtonePlayerImpl>(context, *this, ringtoneType);
893 CHECK_AND_RETURN_RET_LOG(ringtonePlayer != nullptr, nullptr,
894 "Failed to create ringtone player object");
895 return ringtonePlayer;
896 }
897
GetSpecificRingTonePlayer(const shared_ptr<Context> & context,const RingtoneType ringtoneType,string & ringtoneUri)898 std::shared_ptr<RingtonePlayer> SystemSoundManagerImpl::GetSpecificRingTonePlayer(
899 const shared_ptr<Context> &context, const RingtoneType ringtoneType, string &ringtoneUri)
900 {
901 std::lock_guard<std::mutex> lock(playerMutex_);
902 CHECK_AND_RETURN_RET_LOG(IsRingtoneTypeValid(ringtoneType), nullptr, "invalid ringtone type");
903 MEDIA_LOGI("GetSpecificRingTonePlayer: for ringtoneType %{public}d", ringtoneType);
904
905 if (ringtoneUri.empty()) {
906 // ringtoneUri is empty. Use current ringtone uri.
907 std::shared_ptr<RingtonePlayer> ringtonePlayer =
908 std::make_shared<RingtonePlayerImpl>(context, *this, ringtoneType);
909 CHECK_AND_RETURN_RET_LOG(ringtonePlayer != nullptr, nullptr,
910 "Failed to create ringtone player object");
911 return ringtonePlayer;
912 }
913 std::shared_ptr<RingtonePlayer> ringtonePlayer = std::make_shared<RingtonePlayerImpl>(context,
914 *this, ringtoneType, ringtoneUri);
915 CHECK_AND_RETURN_RET_LOG(ringtonePlayer != nullptr, nullptr,
916 "Failed to create ringtone player object");
917 return ringtonePlayer;
918 }
919
GetSystemTonePlayer(const std::shared_ptr<AbilityRuntime::Context> & context,SystemToneType systemToneType)920 std::shared_ptr<SystemTonePlayer> SystemSoundManagerImpl::GetSystemTonePlayer(
921 const std::shared_ptr<AbilityRuntime::Context> &context, SystemToneType systemToneType)
922 {
923 std::lock_guard<std::mutex> lock(playerMutex_);
924 CHECK_AND_RETURN_RET_LOG(IsSystemToneTypeValid(systemToneType), nullptr, "invalid system tone type");
925 MEDIA_LOGI("GetSystemTonePlayer: for systemToneType %{public}d", systemToneType);
926
927 std::shared_ptr<SystemTonePlayer> systemTonePlayer =
928 std::make_shared<SystemTonePlayerImpl>(context, *this, systemToneType);
929 CHECK_AND_RETURN_RET_LOG(systemTonePlayer != nullptr, nullptr,
930 "Failed to create system tone player object");
931 return systemTonePlayer;
932 }
933
UpdateShotToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const int32_t & toneId,SystemToneType systemToneType,const int32_t & num)934 int32_t SystemSoundManagerImpl::UpdateShotToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
935 const int32_t &toneId, SystemToneType systemToneType, const int32_t &num)
936 {
937 ShotToneType type = SHOT_TONE_TYPE_SIM_CARD_1;
938 DataSharePredicates updateOnlyPredicates;
939 DataShareValuesBucket updateOnlyValuesBucket;
940 updateOnlyPredicates.SetWhereClause(RINGTONE_COLUMN_SHOT_TONE_TYPE + " = ? AND " +
941 RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE + " = ? ");
942 updateOnlyPredicates.SetWhereArgs({to_string(systemTypeMap_[systemToneType]),
943 to_string(SOURCE_TYPE_CUSTOMISED)});
944 updateOnlyValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_TYPE, RING_TONE_TYPE_NOT);
945 updateOnlyValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
946 dataShareHelper->Update(RINGTONEURI, updateOnlyPredicates, updateOnlyValuesBucket);
947
948 DataSharePredicates updateBothPredicates;
949 DataShareValuesBucket updateBothValuesBucket;
950 if (systemTypeMap_[systemToneType] == SHOT_TONE_TYPE_SIM_CARD_1) {
951 type = SHOT_TONE_TYPE_SIM_CARD_2;
952 }
953 updateBothPredicates.SetWhereClause(RINGTONE_COLUMN_SHOT_TONE_TYPE + " = ? AND " +
954 RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE + " = ? ");
955 updateBothPredicates.SetWhereArgs({to_string(SHOT_TONE_TYPE_SIM_CARD_BOTH),
956 to_string(SOURCE_TYPE_CUSTOMISED)});
957 updateBothValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_TYPE, type);
958 dataShareHelper->Update(RINGTONEURI, updateBothPredicates, updateBothValuesBucket);
959
960 DataSharePredicates updatePredicates;
961 DataShareValuesBucket updateValuesBucket;
962 if (((num == SHOT_TONE_TYPE_SIM_CARD_1 || num == RING_TONE_TYPE_SIM_CARD_BOTH) &&
963 (systemTypeMap_[systemToneType] == SHOT_TONE_TYPE_SIM_CARD_2)) ||
964 ((num == SHOT_TONE_TYPE_SIM_CARD_2 || num == RING_TONE_TYPE_SIM_CARD_BOTH) &&
965 (systemTypeMap_[systemToneType] == SHOT_TONE_TYPE_SIM_CARD_1))) {
966 type = SHOT_TONE_TYPE_SIM_CARD_BOTH;
967 } else {
968 type = shotToneTypeMap_[systemToneType];
969 }
970 updatePredicates.SetWhereClause(RINGTONE_COLUMN_TONE_ID + " = ? ");
971 updatePredicates.SetWhereArgs({to_string(toneId)});
972 updateValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_TYPE, type);
973 updateValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE, SOURCE_TYPE_CUSTOMISED);
974 return dataShareHelper->Update(RINGTONEURI, updatePredicates, updateValuesBucket);
975 }
976
UpdateNotificatioToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const int32_t & toneId)977 int32_t SystemSoundManagerImpl::UpdateNotificatioToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
978 const int32_t &toneId)
979 {
980 DataSharePredicates updateOldPredicates;
981 DataShareValuesBucket updateOldValuesBucket;
982 updateOldPredicates.SetWhereClause(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE + " = ? AND " +
983 RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE + " = ? ");
984 updateOldPredicates.SetWhereArgs({to_string(NOTIFICATION_TONE_TYPE), to_string(SOURCE_TYPE_CUSTOMISED)});
985 updateOldValuesBucket.Put(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE, NOTIFICATION_TONE_TYPE_NOT);
986 updateOldValuesBucket.Put(RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
987 dataShareHelper->Update(RINGTONEURI, updateOldPredicates, updateOldValuesBucket);
988
989 DataSharePredicates updatePredicates;
990 DataShareValuesBucket updateValuesBucket;
991 updatePredicates.SetWhereClause(RINGTONE_COLUMN_TONE_ID + " = ? ");
992 updatePredicates.SetWhereArgs({to_string(toneId)});
993 updateValuesBucket.Put(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE, NOTIFICATION_TONE_TYPE);
994 updateValuesBucket.Put(RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE, SOURCE_TYPE_CUSTOMISED);
995 return dataShareHelper->Update(RINGTONEURI, updatePredicates, updateValuesBucket);
996 }
997
SetNoSystemToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,SystemToneType systemToneType)998 int32_t SystemSoundManagerImpl::SetNoSystemToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
999 SystemToneType systemToneType)
1000 {
1001 int32_t result = 0;
1002 // Removes the flag for the current system tone uri.
1003 result += RemoveSourceTypeForSystemTone(dataShareHelper, systemToneType, SOURCE_TYPE_CUSTOMISED);
1004 // Removes the flag for the preset system tone uri.
1005 result += RemoveSourceTypeForSystemTone(dataShareHelper, systemToneType, SOURCE_TYPE_PRESET);
1006 MEDIA_LOGI("Set no audio uri for system tone type %{public}d. changedRows %{public}d", systemToneType, result);
1007 return result;
1008 }
1009
RemoveSourceTypeForSystemTone(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,SystemToneType systemToneType,SourceType sourceType)1010 int32_t SystemSoundManagerImpl::RemoveSourceTypeForSystemTone(
1011 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, SystemToneType systemToneType, SourceType sourceType)
1012 {
1013 int32_t result = 0;
1014 switch (systemToneType) {
1015 case SYSTEM_TONE_TYPE_SIM_CARD_0:
1016 case SYSTEM_TONE_TYPE_SIM_CARD_1: {
1017 // SIM_CARD_0 or SIM_CARD_1
1018 DataSharePredicates updateOnlyPredicates;
1019 DataShareValuesBucket updateOnlyValuesBucket;
1020 updateOnlyPredicates.SetWhereClause(RINGTONE_COLUMN_SHOT_TONE_TYPE + " = ? AND " +
1021 RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE + " = ? ");
1022 updateOnlyPredicates.SetWhereArgs({to_string(systemTypeMap_[systemToneType]), to_string(sourceType)});
1023 updateOnlyValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_TYPE, RING_TONE_TYPE_NOT);
1024 updateOnlyValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
1025 result += dataShareHelper->Update(RINGTONEURI, updateOnlyPredicates, updateOnlyValuesBucket);
1026 // both SIM_CARD_0 and SIM_CARD_1
1027 DataSharePredicates updateBothPredicates;
1028 DataShareValuesBucket updateBothValuesBucket;
1029 ShotToneType type = SHOT_TONE_TYPE_SIM_CARD_1;
1030 if (systemTypeMap_[systemToneType] == SHOT_TONE_TYPE_SIM_CARD_1) {
1031 type = SHOT_TONE_TYPE_SIM_CARD_2;
1032 }
1033 updateBothPredicates.SetWhereClause(RINGTONE_COLUMN_SHOT_TONE_TYPE + " = ? AND " +
1034 RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE + " = ? ");
1035 updateBothPredicates.SetWhereArgs({to_string(SHOT_TONE_TYPE_SIM_CARD_BOTH), to_string(sourceType)});
1036 updateBothValuesBucket.Put(RINGTONE_COLUMN_SHOT_TONE_TYPE, type);
1037 result += dataShareHelper->Update(RINGTONEURI, updateBothPredicates, updateBothValuesBucket);
1038 break;
1039 }
1040 case SYSTEM_TONE_TYPE_NOTIFICATION: {
1041 DataSharePredicates updateOldPredicates;
1042 DataShareValuesBucket updateOldValuesBucket;
1043 updateOldPredicates.SetWhereClause(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE + " = ? AND " +
1044 RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE + " = ? ");
1045 updateOldPredicates.SetWhereArgs({to_string(NOTIFICATION_TONE_TYPE), to_string(sourceType)});
1046 updateOldValuesBucket.Put(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE, NOTIFICATION_TONE_TYPE_NOT);
1047 updateOldValuesBucket.Put(RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
1048 result += dataShareHelper->Update(RINGTONEURI, updateOldPredicates, updateOldValuesBucket);
1049 break;
1050 }
1051 default:
1052 MEDIA_LOGE("The system tone type [%{public}d] is invalid!", systemToneType);
1053 break;
1054 }
1055 return result;
1056 }
1057
SetSystemToneUri(const shared_ptr<Context> & context,const string & uri,SystemToneType systemToneType)1058 int32_t SystemSoundManagerImpl::SetSystemToneUri(const shared_ptr<Context> &context, const string &uri,
1059 SystemToneType systemToneType)
1060 {
1061 std::lock_guard<std::mutex> lock(uriMutex_);
1062 CHECK_AND_RETURN_RET_LOG(IsSystemToneTypeValid(systemToneType), MSERR_INVALID_VAL, "Invalid system tone type");
1063
1064 MEDIA_LOGI("SetSystemToneUri: systemToneType %{public}d, uri %{public}s", systemToneType, uri.c_str());
1065 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
1066 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1067 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR, "Create dataShare failed.");
1068
1069 if (uri == NO_SYSTEM_SOUND) {
1070 (void)SetNoSystemToneUri(dataShareHelper, systemToneType);
1071 dataShareHelper->Release();
1072 return SUCCESS;
1073 }
1074
1075 DataShare::DatashareBusinessError businessError;
1076 DataShare::DataSharePredicates queryPredicates;
1077 DataShare::DataSharePredicates queryPredicatesByUri;
1078 queryPredicatesByUri.EqualTo(RINGTONE_COLUMN_DATA, uri);
1079 auto resultSetByUri = dataShareHelper->Query(RINGTONEURI, queryPredicatesByUri, COLUMNS, &businessError);
1080 auto resultsByUri = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSetByUri));
1081 unique_ptr<RingtoneAsset> ringtoneAssetByUri = resultsByUri->GetFirstObject();
1082 if (ringtoneAssetByUri == nullptr) {
1083 resultSetByUri == nullptr ? : resultSetByUri->Close();
1084 dataShareHelper->Release();
1085 MEDIA_LOGE("Failed to find the uri in ringtone library!");
1086 return ERROR;
1087 }
1088 resultSetByUri == nullptr ? : resultSetByUri->Close();
1089 queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, TONE_TYPE_NOTIFICATION);
1090 auto resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1091 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1092 CHECK_AND_RETURN_RET_LOG(results != nullptr, ERROR, "query failed, ringtone library error.");
1093 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1094 while ((ringtoneAsset != nullptr) && (uri != ringtoneAsset->GetPath())) {
1095 ringtoneAsset = results->GetNextObject();
1096 }
1097 if (ringtoneAsset != nullptr) {
1098 int32_t changedRows = 0;
1099 if (systemToneType == SYSTEM_TONE_TYPE_NOTIFICATION) {
1100 changedRows = UpdateNotificatioToneUri(dataShareHelper, ringtoneAsset->GetId());
1101 } else {
1102 changedRows = UpdateShotToneUri(dataShareHelper, ringtoneAsset->GetId(),
1103 systemToneType, ringtoneAsset->GetShottoneType());
1104 }
1105 resultSet == nullptr ? : resultSet->Close();
1106 SetExtRingtoneUri(uri, ringtoneAsset->GetTitle(), systemToneType, TONE_TYPE_NOTIFICATION, changedRows);
1107 return changedRows > 0 ? SUCCESS : ERROR;
1108 }
1109 resultSet == nullptr ? : resultSet->Close();
1110 dataShareHelper->Release();
1111 return TYPEERROR;
1112 }
1113
GetShotToneUriByType(const DatabaseTool & databaseTool,const std::string & type)1114 std::string SystemSoundManagerImpl::GetShotToneUriByType(const DatabaseTool &databaseTool, const std::string &type)
1115 {
1116 MEDIA_LOGI("Enter the GetShotToneUriByType interface.");
1117 ToneAttrs toneAttrs = GetShotToneAttrsByType(databaseTool, type);
1118 return toneAttrs.GetUri();
1119 }
1120
GetShotToneAttrsByType(const DatabaseTool & databaseTool,const std::string & type)1121 ToneAttrs SystemSoundManagerImpl::GetShotToneAttrsByType(const DatabaseTool &databaseTool, const std::string &type)
1122 {
1123 ToneAttrs toneAttrs = { "", "", "", CUSTOMISED, TONE_CATEGORY_TEXT_MESSAGE };
1124 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
1125 MEDIA_LOGE("The database tool is not ready!");
1126 return toneAttrs;
1127 }
1128
1129 std::string uri = "";
1130 DataShare::DatashareBusinessError businessError;
1131 DataShare::DataSharePredicates queryPredicates;
1132 queryPredicates.SetWhereClause(RINGTONE_COLUMN_SHOT_TONE_TYPE + " = ? AND " +
1133 RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE + " = ? ");
1134 queryPredicates.SetWhereArgs({type, to_string(SOURCE_TYPE_CUSTOMISED)});
1135
1136 std::string ringtoneLibraryUri = "";
1137 if (databaseTool.isProxy) {
1138 ringtoneLibraryUri = RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES +
1139 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
1140 } else {
1141 ringtoneLibraryUri = RINGTONE_PATH_URI;
1142 }
1143 Uri queryUri(ringtoneLibraryUri);
1144 auto resultSet = databaseTool.dataShareHelper->Query(queryUri, queryPredicates, COLUMNS, &businessError);
1145 MEDIA_LOGI("dataShareHelper->Query: errCode %{public}d", businessError.GetCode());
1146 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1147 CHECK_AND_RETURN_RET_LOG(results != nullptr, toneAttrs, "query failed, ringtone library error.");
1148 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1149 if (ringtoneAsset != nullptr) {
1150 toneAttrs.SetCategory(ringtoneAsset->GetToneType());
1151 toneAttrs.SetFileName(ringtoneAsset->GetDisplayName());
1152 toneAttrs.SetTitle(ringtoneAsset->GetTitle());
1153 toneAttrs.SetUri(ringtoneAsset->GetPath());
1154 if (ringtoneAsset->GetMediaType() == RINGTONE_MEDIA_TYPE_VIDEO) {
1155 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_VID);
1156 } else {
1157 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_AUD);
1158 }
1159 }
1160 resultSet == nullptr ? : resultSet->Close();
1161 return toneAttrs;
1162 }
1163
GetPresetShotToneUriByType(const DatabaseTool & databaseTool,const std::string & type)1164 std::string SystemSoundManagerImpl::GetPresetShotToneUriByType(const DatabaseTool &databaseTool,
1165 const std::string &type)
1166 {
1167 MEDIA_LOGI("Enter the GetPresetShotToneUriByType interface.");
1168 ToneAttrs toneAttrs = GetPresetShotToneAttrsByType(databaseTool, type);
1169 return toneAttrs.GetUri();
1170 }
1171
GetPresetShotToneAttrsByType(const DatabaseTool & databaseTool,const std::string & type)1172 ToneAttrs SystemSoundManagerImpl::GetPresetShotToneAttrsByType(const DatabaseTool &databaseTool,
1173 const std::string &type)
1174 {
1175 ToneAttrs toneAttrs = { "", "", "", CUSTOMISED, TONE_CATEGORY_TEXT_MESSAGE};
1176 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
1177 MEDIA_LOGE("The database tool is not ready!");
1178 return toneAttrs;
1179 }
1180
1181 std::string uri = "";
1182 DataShare::DatashareBusinessError businessError;
1183 DataShare::DataSharePredicates queryPredicates;
1184 queryPredicates.SetWhereClause(RINGTONE_COLUMN_SHOT_TONE_TYPE + " = ? AND " +
1185 RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE + " = ? ");
1186 queryPredicates.SetWhereArgs({type, to_string(SOURCE_TYPE_PRESET)});
1187
1188 std::string ringtoneLibraryUri = "";
1189 if (databaseTool.isProxy) {
1190 ringtoneLibraryUri = RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES +
1191 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
1192 } else {
1193 ringtoneLibraryUri = RINGTONE_PATH_URI;
1194 }
1195 Uri queryUri(ringtoneLibraryUri);
1196 auto resultSet = databaseTool.dataShareHelper->Query(queryUri, queryPredicates, COLUMNS, &businessError);
1197 MEDIA_LOGI("dataShareHelper->Query: errCode %{public}d", businessError.GetCode());
1198 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1199 CHECK_AND_RETURN_RET_LOG(results != nullptr, toneAttrs, "query failed, ringtone library error.");
1200 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1201 if (ringtoneAsset != nullptr) {
1202 toneAttrs.SetUri(ringtoneAsset->GetPath());
1203 toneAttrs.SetTitle(ringtoneAsset->GetTitle());
1204 toneAttrs.SetFileName(ringtoneAsset->GetDisplayName());
1205 toneAttrs.SetCategory(ringtoneAsset->GetToneType());
1206 if (ringtoneAsset->GetMediaType() == RINGTONE_MEDIA_TYPE_VIDEO) {
1207 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_VID);
1208 } else {
1209 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_AUD);
1210 }
1211 }
1212 resultSet == nullptr ? : resultSet->Close();
1213 return toneAttrs;
1214 }
1215
GetNotificationToneUriByType(const DatabaseTool & databaseTool)1216 std::string SystemSoundManagerImpl::GetNotificationToneUriByType(const DatabaseTool &databaseTool)
1217 {
1218 MEDIA_LOGI("Enter the GetNotificationToneUriByType interface.");
1219 ToneAttrs toneAttrs = GetNotificationToneAttrsByType(databaseTool);
1220 return toneAttrs.GetUri();
1221 }
1222
GetNotificationToneAttrsByType(const DatabaseTool & databaseTool)1223 ToneAttrs SystemSoundManagerImpl::GetNotificationToneAttrsByType(const DatabaseTool &databaseTool)
1224 {
1225 ToneAttrs toneAttrs = { "", "", "", CUSTOMISED, TONE_CATEGORY_NOTIFICATION };
1226 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
1227 MEDIA_LOGE("The database tool is not ready!");
1228 return toneAttrs;
1229 }
1230
1231 std::string uri = "";
1232 DataShare::DatashareBusinessError businessError;
1233 DataShare::DataSharePredicates queryPredicates;
1234 queryPredicates.SetWhereClause(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE + " = ? AND " +
1235 RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE + " = ? ");
1236 queryPredicates.SetWhereArgs({to_string(NOTIFICATION_TONE_TYPE), to_string(SOURCE_TYPE_CUSTOMISED)});
1237
1238 std::string ringtoneLibraryUri = "";
1239 if (databaseTool.isProxy) {
1240 ringtoneLibraryUri = RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES +
1241 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
1242 } else {
1243 ringtoneLibraryUri = RINGTONE_PATH_URI;
1244 }
1245 Uri queryUri(ringtoneLibraryUri);
1246 auto resultSet = databaseTool.dataShareHelper->Query(queryUri, queryPredicates, COLUMNS, &businessError);
1247 MEDIA_LOGI("dataShareHelper->Query: errCode %{public}d", businessError.GetCode());
1248 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1249 CHECK_AND_RETURN_RET_LOG(results != nullptr, toneAttrs, "query failed, ringtone library error.");
1250 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1251 if (ringtoneAsset != nullptr) {
1252 toneAttrs.SetUri(ringtoneAsset->GetPath());
1253 toneAttrs.SetTitle(ringtoneAsset->GetTitle());
1254 toneAttrs.SetFileName(ringtoneAsset->GetDisplayName());
1255 toneAttrs.SetCategory(ringtoneAsset->GetToneType());
1256 if (ringtoneAsset->GetMediaType() == RINGTONE_MEDIA_TYPE_VIDEO) {
1257 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_VID);
1258 } else {
1259 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_AUD);
1260 }
1261 }
1262 resultSet == nullptr ? : resultSet->Close();
1263 return toneAttrs;
1264 }
1265
GetPresetNotificationToneUri(const DatabaseTool & databaseTool)1266 std::string SystemSoundManagerImpl::GetPresetNotificationToneUri(const DatabaseTool &databaseTool)
1267 {
1268 MEDIA_LOGI("Enter the GetPresetNotificationToneUri interface.");
1269 ToneAttrs toneAttrs = GetPresetNotificationToneAttrs(databaseTool);
1270 return toneAttrs.GetUri();
1271 }
1272
GetPresetNotificationToneAttrs(const DatabaseTool & databaseTool)1273 ToneAttrs SystemSoundManagerImpl::GetPresetNotificationToneAttrs(const DatabaseTool &databaseTool)
1274 {
1275 ToneAttrs toneAttrs = { "", "", "", CUSTOMISED, TONE_CATEGORY_NOTIFICATION };
1276 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
1277 MEDIA_LOGE("The database tool is not ready!");
1278 return toneAttrs;
1279 }
1280
1281 std::string uri = "";
1282 DataShare::DatashareBusinessError businessError;
1283 DataShare::DataSharePredicates queryPredicates;
1284 queryPredicates.SetWhereClause(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE + " = ? AND " +
1285 RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE + " = ? ");
1286 queryPredicates.SetWhereArgs({to_string(NOTIFICATION_TONE_TYPE), to_string(SOURCE_TYPE_PRESET)});
1287
1288 std::string ringtoneLibraryUri = "";
1289 if (databaseTool.isProxy) {
1290 ringtoneLibraryUri = RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES +
1291 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
1292 } else {
1293 ringtoneLibraryUri = RINGTONE_PATH_URI;
1294 }
1295 Uri queryUri(ringtoneLibraryUri);
1296 auto resultSet = databaseTool.dataShareHelper->Query(queryUri, queryPredicates, COLUMNS, &businessError);
1297 MEDIA_LOGI("dataShareHelper->Query: errCode %{public}d", businessError.GetCode());
1298 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1299 CHECK_AND_RETURN_RET_LOG(results != nullptr, toneAttrs, "query failed, ringtone library error.");
1300 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1301 if (ringtoneAsset != nullptr) {
1302 toneAttrs.SetUri(ringtoneAsset->GetPath());
1303 toneAttrs.SetTitle(ringtoneAsset->GetTitle());
1304 toneAttrs.SetFileName(ringtoneAsset->GetDisplayName());
1305 toneAttrs.SetCategory(ringtoneAsset->GetToneType());
1306 if (ringtoneAsset->GetMediaType() == RINGTONE_MEDIA_TYPE_VIDEO) {
1307 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_VID);
1308 } else {
1309 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_AUD);
1310 }
1311 }
1312 resultSet == nullptr ? : resultSet->Close();
1313 return toneAttrs;
1314 }
1315
GetSystemToneUri(const std::shared_ptr<AbilityRuntime::Context> & context,SystemToneType systemToneType)1316 std::string SystemSoundManagerImpl::GetSystemToneUri(const std::shared_ptr<AbilityRuntime::Context> &context,
1317 SystemToneType systemToneType)
1318 {
1319 MEDIA_LOGI("Enter the GetSystemToneUri interface.");
1320 ToneAttrs toneAttrs = GetSystemToneAttrs(systemToneType);
1321 return toneAttrs.GetUri();
1322 }
1323
GetSystemToneAttrs(SystemToneType systemToneType)1324 ToneAttrs SystemSoundManagerImpl::GetSystemToneAttrs(SystemToneType systemToneType)
1325 {
1326 MEDIA_LOGI("GetSystemToneAttrs: Start, systemToneType: %{public}d", systemToneType);
1327 int32_t category = systemToneType == SYSTEM_TONE_TYPE_NOTIFICATION ?
1328 TONE_CATEGORY_NOTIFICATION : TONE_CATEGORY_TEXT_MESSAGE;
1329 ToneAttrs toneAttrs = { "", "", "", CUSTOMISED, category };
1330 CHECK_AND_RETURN_RET_LOG(IsSystemToneTypeValid(systemToneType), toneAttrs, "Invalid system tone type");
1331
1332 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1333 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1334 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1335 bool isProxy = (result == Security::AccessToken::PermissionState::PERMISSION_GRANTED &&
1336 SystemSoundManagerUtils::GetScannerFirstParameter(RINGTONE_PARAMETER_SCANNER_FIRST_KEY, RINGTONEPARA_SIZE) &&
1337 SystemSoundManagerUtils::CheckCurrentUser()) ? true : false;
1338 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = isProxy ?
1339 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID) :
1340 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1341 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, toneAttrs,
1342 "Failed to CreateDataShareHelper! datashare or ringtone library error.");
1343 DatabaseTool databaseTool = {true, isProxy, dataShareHelper};
1344 toneAttrs = GetSystemToneAttrs(databaseTool, systemToneType);
1345 dataShareHelper->Release();
1346 MEDIA_LOGI("Finish to get system tone uri: type %{public}d, uri %{public}s", systemToneType,
1347 toneAttrs.GetUri().c_str());
1348 return toneAttrs;
1349 }
1350
GetSystemToneAttrs(const DatabaseTool & databaseTool,SystemToneType systemToneType)1351 ToneAttrs SystemSoundManagerImpl::GetSystemToneAttrs(const DatabaseTool &databaseTool, SystemToneType systemToneType)
1352 {
1353 int32_t category = systemToneType == SYSTEM_TONE_TYPE_NOTIFICATION ?
1354 TONE_CATEGORY_NOTIFICATION : TONE_CATEGORY_TEXT_MESSAGE;
1355 ToneAttrs toneAttrs = { "", "", "", CUSTOMISED, category};
1356 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
1357 MEDIA_LOGE("The database tool is not ready!");
1358 return toneAttrs;
1359 }
1360
1361 switch (systemToneType) {
1362 case SYSTEM_TONE_TYPE_SIM_CARD_0:
1363 case SYSTEM_TONE_TYPE_SIM_CARD_1:
1364 toneAttrs = GetShotToneAttrsByType(databaseTool, to_string(systemTypeMap_[systemToneType]));
1365 if (toneAttrs.GetUri().empty()) {
1366 toneAttrs = GetShotToneAttrsByType(databaseTool, to_string(RING_TONE_TYPE_SIM_CARD_BOTH));
1367 }
1368 if (toneAttrs.GetUri().empty()) {
1369 toneAttrs = GetPresetShotToneAttrsByType(databaseTool, to_string(systemTypeMap_[systemToneType]));
1370 }
1371 if (toneAttrs.GetUri().empty()) {
1372 toneAttrs = GetPresetShotToneAttrsByType(databaseTool, to_string(RING_TONE_TYPE_SIM_CARD_BOTH));
1373 }
1374 break;
1375 case SYSTEM_TONE_TYPE_NOTIFICATION:
1376 toneAttrs = GetNotificationToneAttrsByType(databaseTool);
1377 if (toneAttrs.GetUri().empty()) {
1378 toneAttrs = GetNotificationToneAttrsByType(databaseTool);
1379 }
1380 break;
1381 default:
1382 break;
1383 }
1384 if (toneAttrs.GetUri().empty()) {
1385 MEDIA_LOGI("GetSystemToneAttrs: No system tone uri for type %{public}d. Return NO_SYSTEM_SOUND",
1386 systemToneType);
1387 toneAttrs.SetUri(NO_SYSTEM_SOUND);
1388 }
1389 return toneAttrs;
1390 }
1391
GetDefaultRingtoneAttrs(const shared_ptr<Context> & context,RingtoneType ringtoneType)1392 std::shared_ptr<ToneAttrs> SystemSoundManagerImpl::GetDefaultRingtoneAttrs(
1393 const shared_ptr<Context> &context, RingtoneType ringtoneType)
1394 {
1395 MEDIA_LOGI("GetDefaultRingtoneAttrs : Enter the getDefaultRingtoneAttrs interface");
1396 std::lock_guard<std::mutex> lock(uriMutex_);
1397 CHECK_AND_RETURN_RET_LOG(IsRingtoneTypeValid(ringtoneType), nullptr, "Invalid ringtone type");
1398 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
1399 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1400 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr, "Create dataShare failed.");
1401 DataShare::DatashareBusinessError businessError;
1402 DataShare::DataSharePredicates queryPredicates;
1403 ringtoneAttrs_ = nullptr;
1404 std::vector<std::string> onClause;
1405 onClause.push_back(RINGTONE_TABLE + "." + RINGTONE_COLUMN_TONE_ID + "=" +
1406 PRELOAD_CONFIG_TABLE + "." + PRELOAD_CONFIG_COLUMN_TONE_ID);
1407 queryPredicates.InnerJoin(PRELOAD_CONFIG_TABLE)->On(onClause)->EqualTo(
1408 PRELOAD_CONFIG_TABLE + "." + PRELOAD_CONFIG_COLUMN_RING_TONE_TYPE, defaultoneTypeMap_[ringtoneType]);
1409 Uri RINGTONEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES + "&user=" +
1410 std::to_string(SystemSoundManagerUtils::GetCurrentUserId()));
1411 auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, JOIN_COLUMNS, &businessError);
1412 int32_t errCode = businessError.GetCode();
1413 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1414 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1415 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1416 MEDIA_LOGI("GetDefaultRingtoneAttrs: errCode:%{public}d, result :%{public}d ", errCode, result);
1417 if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED ||
1418 !SystemSoundManagerUtils::GetScannerFirstParameter(RINGTONE_PARAMETER_SCANNER_FIRST_KEY, RINGTONEPARA_SIZE) ||
1419 !SystemSoundManagerUtils::CheckCurrentUser()) {
1420 dataShareHelper = SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1421 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr, "Invalid dataShare.");
1422 resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, JOIN_COLUMNS, &businessError);
1423 }
1424 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1425 CHECK_AND_RETURN_RET_LOG(results != nullptr, nullptr, "single sim card failed, ringtone library error.");
1426 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1427 while ((ringtoneAsset != nullptr) && (TONE_TYPE_RINGTONE != ringtoneAsset->GetToneType())) {
1428 ringtoneAsset = results->GetNextObject();
1429 }
1430 if (ringtoneAsset != nullptr) {
1431 ringtoneAttrs_ = std::make_shared<ToneAttrs>(ringtoneAsset->GetTitle(), ringtoneAsset->GetDisplayName(),
1432 ringtoneAsset->GetPath(), sourceTypeMap_[ringtoneAsset->GetSourceType()], TONE_CATEGORY_RINGTONE);
1433 MEDIA_LOGI("RingtoneAttrs_ : Title = %{public}s", ringtoneAsset->GetTitle().c_str());
1434 } else {
1435 MEDIA_LOGE("GetDefaultRingtoneAttrs: no single card default ringtone in the ringtone library!");
1436 }
1437 resultSet == nullptr ? : resultSet->Close();
1438 dataShareHelper->Release();
1439 return ringtoneAttrs_;
1440 }
1441
GetRingtoneAttrList(const std::shared_ptr<AbilityRuntime::Context> & context,RingtoneType ringtoneType)1442 std::vector<std::shared_ptr<ToneAttrs>> SystemSoundManagerImpl::GetRingtoneAttrList(
1443 const std::shared_ptr<AbilityRuntime::Context> &context, RingtoneType ringtoneType)
1444 {
1445 MEDIA_LOGI("GetRingtoneAttrList : Enter the getRingtoneAttrList interface");
1446 std::lock_guard<std::mutex> lock(uriMutex_);
1447 ringtoneAttrsArray_.clear();
1448 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
1449 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1450 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ringtoneAttrsArray_,
1451 "Create dataShare failed, datashare or ringtone library error.");
1452 DataShare::DatashareBusinessError businessError;
1453 DataShare::DataSharePredicates queryPredicates;
1454 queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, to_string(TONE_TYPE_RINGTONE));
1455 queryPredicates.GreaterThan(RINGTONE_COLUMN_MEDIA_TYPE, to_string(RINGTONE_MEDIA_TYPE_INVALID));
1456 Uri RINGTONEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES + "&user=" +
1457 std::to_string(SystemSoundManagerUtils::GetCurrentUserId()));
1458 auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
1459 int32_t errCode = businessError.GetCode();
1460 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1461 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1462 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1463 MEDIA_LOGI("GetRingtoneAttrList:errCode:%{public}d, result :%{public}d ", errCode, result);
1464 if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED ||
1465 !SystemSoundManagerUtils::GetScannerFirstParameter(RINGTONE_PARAMETER_SCANNER_FIRST_KEY, RINGTONEPARA_SIZE) ||
1466 !SystemSoundManagerUtils::CheckCurrentUser()) {
1467 dataShareHelper = SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1468 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ringtoneAttrsArray_,
1469 "Invalid dataShare, datashare or ringtone library error.");
1470 resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1471 }
1472 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1473 CHECK_AND_RETURN_RET_LOG(results != nullptr, ringtoneAttrsArray_, "query failed, ringtone library error.");
1474 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1475 while (ringtoneAsset != nullptr) {
1476 ringtoneAttrs_ = std::make_shared<ToneAttrs>(ringtoneAsset->GetTitle(),
1477 ringtoneAsset->GetDisplayName(), ringtoneAsset->GetPath(),
1478 sourceTypeMap_[ringtoneAsset->GetSourceType()], TONE_CATEGORY_RINGTONE);
1479 ringtoneAttrsArray_.push_back(ringtoneAttrs_);
1480 ringtoneAsset = results->GetNextObject();
1481 }
1482 if (ringtoneAttrsArray_.empty()) {
1483 MEDIA_LOGE("GetRingtoneAttrList: no ringtone in the ringtone library!");
1484 }
1485 resultSet == nullptr ? : resultSet->Close();
1486 dataShareHelper->Release();
1487 return ringtoneAttrsArray_;
1488 }
1489
GetDefaultSystemToneAttrs(const std::shared_ptr<AbilityRuntime::Context> & context,SystemToneType systemToneType)1490 std::shared_ptr<ToneAttrs> SystemSoundManagerImpl::GetDefaultSystemToneAttrs(
1491 const std::shared_ptr<AbilityRuntime::Context> &context, SystemToneType systemToneType)
1492 {
1493 MEDIA_LOGI("GetDefaultSystemToneAttrs : Enter the getDefaultSystemToneAttrs interface");
1494 std::lock_guard<std::mutex> lock(uriMutex_);
1495 CHECK_AND_RETURN_RET_LOG(IsSystemToneTypeValid(systemToneType), nullptr, "Invalid systemtone type");
1496 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
1497 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1498 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr, "Create dataShare failed.");
1499 std::string ringToneType = systemToneType == SYSTEM_TONE_TYPE_NOTIFICATION ?
1500 RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE : RINGTONE_COLUMN_SHOT_TONE_TYPE;
1501 int32_t category = systemToneType == SYSTEM_TONE_TYPE_NOTIFICATION ?
1502 TONE_CATEGORY_NOTIFICATION : TONE_CATEGORY_TEXT_MESSAGE;
1503 DataShare::DatashareBusinessError businessError;
1504 DataShare::DataSharePredicates queryPredicates;
1505 systemtoneAttrs_ = nullptr;
1506 std::vector<std::string> onClause;
1507 onClause.push_back(RINGTONE_TABLE + "." + RINGTONE_COLUMN_TONE_ID + "=" +
1508 PRELOAD_CONFIG_TABLE + "." + PRELOAD_CONFIG_COLUMN_TONE_ID);
1509 queryPredicates.InnerJoin(PRELOAD_CONFIG_TABLE)->On(onClause)->EqualTo(
1510 PRELOAD_CONFIG_TABLE + "." + PRELOAD_CONFIG_COLUMN_RING_TONE_TYPE, defaultsystemTypeMap_[systemToneType]);
1511 Uri RINGTONEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES + "&user=" +
1512 std::to_string(SystemSoundManagerUtils::GetCurrentUserId()));
1513 auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, JOIN_COLUMNS, &businessError);
1514 int32_t errCode = businessError.GetCode();
1515 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1516 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1517 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1518 if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED ||
1519 !SystemSoundManagerUtils::GetScannerFirstParameter(RINGTONE_PARAMETER_SCANNER_FIRST_KEY, RINGTONEPARA_SIZE) ||
1520 !SystemSoundManagerUtils::CheckCurrentUser()) {
1521 dataShareHelper = SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1522 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr, "Invalid dataShare.");
1523 resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, JOIN_COLUMNS, &businessError);
1524 }
1525 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1526 CHECK_AND_RETURN_RET_LOG(results != nullptr, nullptr, "query single systemtone failed, ringtone library error.");
1527 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1528 while ((ringtoneAsset != nullptr) && IsSystemToneType(ringtoneAsset, systemToneType)) {
1529 ringtoneAsset = results->GetNextObject();
1530 }
1531 if (ringtoneAsset != nullptr) {
1532 systemtoneAttrs_ = std::make_shared<ToneAttrs>(ringtoneAsset->GetTitle(), ringtoneAsset->GetDisplayName(),
1533 ringtoneAsset->GetPath(), sourceTypeMap_[ringtoneAsset->GetSourceType()], category);
1534 } else {
1535 MEDIA_LOGE("GetDefaultSystemToneAttrs: no single default systemtone in the ringtone library!");
1536 }
1537 resultSet == nullptr ? : resultSet->Close();
1538 dataShareHelper->Release();
1539 return systemtoneAttrs_;
1540 }
1541
GetSystemToneAttrList(const std::shared_ptr<AbilityRuntime::Context> & context,SystemToneType systemToneType)1542 std::vector<std::shared_ptr<ToneAttrs>> SystemSoundManagerImpl::GetSystemToneAttrList(
1543 const std::shared_ptr<AbilityRuntime::Context> &context, SystemToneType systemToneType)
1544 {
1545 std::lock_guard<std::mutex> lock(uriMutex_);
1546 systemtoneAttrsArray_.clear();
1547 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
1548 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1549 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, systemtoneAttrsArray_,
1550 "Create dataShare failed, datashare or ringtone library error.");
1551 int32_t category = systemToneType == SYSTEM_TONE_TYPE_NOTIFICATION ?
1552 TONE_CATEGORY_NOTIFICATION : TONE_CATEGORY_TEXT_MESSAGE;
1553 DataShare::DatashareBusinessError businessError;
1554 DataShare::DataSharePredicates queryPredicates;
1555 queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, to_string(TONE_TYPE_NOTIFICATION));
1556 queryPredicates.GreaterThan(RINGTONE_COLUMN_MEDIA_TYPE, to_string(RINGTONE_MEDIA_TYPE_INVALID));
1557 Uri RINGTONEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES + "&user=" +
1558 std::to_string(SystemSoundManagerUtils::GetCurrentUserId()));
1559 auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
1560 int32_t errCode = businessError.GetCode();
1561 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1562 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1563 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1564 MEDIA_LOGI("GetSystemToneAttrList: errCode:%{public}d, result :%{public}d ", errCode, result);
1565 if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED ||
1566 !SystemSoundManagerUtils::GetScannerFirstParameter(RINGTONE_PARAMETER_SCANNER_FIRST_KEY, RINGTONEPARA_SIZE) ||
1567 !SystemSoundManagerUtils::CheckCurrentUser()) {
1568 dataShareHelper = SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1569 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, systemtoneAttrsArray_,
1570 "Invalid dataShare, datashare or ringtone library error.");
1571 resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1572 }
1573 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1574 CHECK_AND_RETURN_RET_LOG(results != nullptr, systemtoneAttrsArray_, "query failed, ringtone library error.");
1575 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1576 while (ringtoneAsset != nullptr) {
1577 systemtoneAttrs_ = std::make_shared<ToneAttrs>(ringtoneAsset->GetTitle(),
1578 ringtoneAsset->GetDisplayName(), ringtoneAsset->GetPath(),
1579 sourceTypeMap_[ringtoneAsset->GetSourceType()], category);
1580 systemtoneAttrsArray_.push_back(systemtoneAttrs_);
1581 ringtoneAsset = results->GetNextObject();
1582 }
1583 if (systemtoneAttrsArray_.empty()) {
1584 MEDIA_LOGE("GetSystemToneAttrList: no systemtone in the ringtone library!");
1585 }
1586 resultSet == nullptr ? : resultSet->Close();
1587 dataShareHelper->Release();
1588 return systemtoneAttrsArray_;
1589 }
1590
SetAlarmToneUri(const std::shared_ptr<AbilityRuntime::Context> & context,const std::string & uri)1591 int32_t SystemSoundManagerImpl::SetAlarmToneUri(const std::shared_ptr<AbilityRuntime::Context> &context,
1592 const std::string &uri)
1593 {
1594 std::lock_guard<std::mutex> lock(uriMutex_);
1595 MEDIA_LOGI("SetAlarmToneUri: Alarm type %{public}d", SystemSoundManagerUtils::GetTypeForSystemSoundUri(uri));
1596 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
1597 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1598 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR, "Create dataShare failed.");
1599 DataShare::DatashareBusinessError businessError;
1600 DataShare::DataSharePredicates queryPredicates;
1601 DataShare::DataSharePredicates queryPredicatesByUri;
1602 queryPredicatesByUri.EqualTo(RINGTONE_COLUMN_DATA, uri);
1603 auto resultSetByUri = dataShareHelper->Query(RINGTONEURI, queryPredicatesByUri, COLUMNS, &businessError);
1604 auto resultsByUri = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSetByUri));
1605 unique_ptr<RingtoneAsset> ringtoneAssetByUri = resultsByUri->GetFirstObject();
1606 if (ringtoneAssetByUri == nullptr) {
1607 MEDIA_LOGE("Failed to find uri in ringtone library. The input uri is invalid!");
1608 resultSetByUri == nullptr ? : resultSetByUri->Close();
1609 dataShareHelper->Release();
1610 return ERROR;
1611 }
1612 resultSetByUri == nullptr ? : resultSetByUri->Close();
1613 queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, TONE_TYPE_ALARM);
1614 auto resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1615 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1616 CHECK_AND_RETURN_RET_LOG(results != nullptr, ERROR, "query failed, ringtone library error.");
1617 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1618 while ((ringtoneAsset != nullptr) && (uri != ringtoneAsset->GetPath())) {
1619 ringtoneAsset = results->GetNextObject();
1620 }
1621 if (ringtoneAsset != nullptr) {
1622 int32_t changedRows = UpdataeAlarmToneUri(dataShareHelper, ringtoneAsset->GetId());
1623 resultSet == nullptr ? : resultSet->Close();
1624 dataShareHelper->Release();
1625 SetExtRingtoneUri(uri, ringtoneAsset->GetTitle(), TONE_TYPE_ALARM, TONE_TYPE_ALARM, changedRows);
1626 return changedRows > 0 ? SUCCESS : ERROR;
1627 }
1628 MEDIA_LOGE("Failed to find uri in ringtone library!");
1629 resultSet == nullptr ? : resultSet->Close();
1630 dataShareHelper->Release();
1631 return TYPEERROR;
1632 }
1633
UpdataeAlarmToneUri(const std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const int32_t ringtoneAssetId)1634 int32_t SystemSoundManagerImpl::UpdataeAlarmToneUri(
1635 const std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, const int32_t ringtoneAssetId)
1636 {
1637 DataSharePredicates updateOldPredicates;
1638 DataShareValuesBucket updateOldValuesBucket;
1639 updateOldPredicates.SetWhereClause(RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE + " = ? ");
1640 updateOldPredicates.SetWhereArgs({to_string(SOURCE_TYPE_CUSTOMISED)});
1641 updateOldValuesBucket.Put(RINGTONE_COLUMN_ALARM_TONE_TYPE, ALARM_TONE_TYPE_NOT);
1642 updateOldValuesBucket.Put(RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE, SOURCE_TYPE_INVALID);
1643 dataShareHelper->Update(RINGTONEURI, updateOldPredicates, updateOldValuesBucket);
1644 DataSharePredicates updatePredicates;
1645 DataShareValuesBucket updateValuesBucket;
1646 updatePredicates.SetWhereClause(RINGTONE_COLUMN_TONE_ID + " = ? ");
1647 updatePredicates.SetWhereArgs({to_string(ringtoneAssetId)});
1648 updateValuesBucket.Put(RINGTONE_COLUMN_ALARM_TONE_TYPE, ALARM_TONE_TYPE);
1649 updateValuesBucket.Put(RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE, SOURCE_TYPE_CUSTOMISED);
1650 int32_t changedRows = dataShareHelper->Update(RINGTONEURI, updatePredicates, updateValuesBucket);
1651 MEDIA_LOGI("UpdataeAlarmToneUri: result(changedRows) %{public}d", changedRows);
1652 return changedRows;
1653 }
1654
GetAlarmToneUri(const std::shared_ptr<AbilityRuntime::Context> & context)1655 std::string SystemSoundManagerImpl::GetAlarmToneUri(const std::shared_ptr<AbilityRuntime::Context> &context)
1656 {
1657 MEDIA_LOGI("Enter the GetAlarmToneUri interface.");
1658 ToneAttrs toneAttrs = GetAlarmToneAttrs(context);
1659 std::string alarmToneUri = toneAttrs.GetUri();
1660 MEDIA_LOGI("GetAlarmToneUri: alarm type %{public}d",
1661 SystemSoundManagerUtils::GetTypeForSystemSoundUri(alarmToneUri));
1662 return alarmToneUri;
1663 }
1664
GetAlarmToneAttrs(const std::shared_ptr<AbilityRuntime::Context> & context)1665 ToneAttrs SystemSoundManagerImpl::GetAlarmToneAttrs(const std::shared_ptr<AbilityRuntime::Context> &context)
1666 {
1667 MEDIA_LOGI("GetAlarmToneAttrs: Start.");
1668 std::lock_guard<std::mutex> lock(uriMutex_);
1669 ToneAttrs toneAttrs = { "", "", "", CUSTOMISED, TONE_CATEGORY_ALARM };
1670 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1671 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1672 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1673 bool isProxy = (result == Security::AccessToken::PermissionState::PERMISSION_GRANTED &&
1674 SystemSoundManagerUtils::GetScannerFirstParameter(RINGTONE_PARAMETER_SCANNER_FIRST_KEY, RINGTONEPARA_SIZE) &&
1675 SystemSoundManagerUtils::CheckCurrentUser()) ? true : false;
1676 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = isProxy ?
1677 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID) :
1678 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1679 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, toneAttrs,
1680 "Failed to CreateDataShareHelper! datashare or ringtone library error.");
1681 DatabaseTool databaseTool = {true, isProxy, dataShareHelper};
1682 toneAttrs = GetAlarmToneAttrs(databaseTool);
1683 MEDIA_LOGI("GetAlarmToneUri: alarm uri %{public}s", toneAttrs.GetUri().c_str());
1684 dataShareHelper->Release();
1685 return toneAttrs;
1686 }
1687
GetAlarmToneAttrs(const DatabaseTool & databaseTool)1688 ToneAttrs SystemSoundManagerImpl::GetAlarmToneAttrs(const DatabaseTool &databaseTool)
1689 {
1690 int32_t count = 2;
1691 ToneAttrs toneAttrs = { "", "", "", CUSTOMISED, TONE_CATEGORY_ALARM };
1692 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
1693 MEDIA_LOGE("The database tool is not ready!");
1694 return toneAttrs;
1695 }
1696 DataShare::DatashareBusinessError businessError;
1697 DataShare::DataSharePredicates queryPredicates;
1698 queryPredicates.EqualTo(RINGTONE_COLUMN_ALARM_TONE_TYPE, to_string(ALARM_TONE_TYPE));
1699 std::string ringtoneLibraryUri = "";
1700 if (databaseTool.isProxy) {
1701 ringtoneLibraryUri = RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES +
1702 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
1703 } else {
1704 ringtoneLibraryUri = RINGTONE_PATH_URI;
1705 }
1706 Uri queryUri(ringtoneLibraryUri);
1707 auto resultSet = databaseTool.dataShareHelper->Query(queryUri, queryPredicates, COLUMNS, &businessError);
1708 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1709 CHECK_AND_RETURN_RET_LOG(results != nullptr, toneAttrs, "query failed, ringtone library error.");
1710 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1711 while ((ringtoneAsset != nullptr) && (SOURCE_TYPE_CUSTOMISED !=
1712 ringtoneAsset->GetAlarmtoneSourceType()) && (results->GetCount() == count)) {
1713 ringtoneAsset = results->GetNextObject();
1714 }
1715 if (ringtoneAsset != nullptr) {
1716 toneAttrs.SetCategory(ringtoneAsset->GetToneType());
1717 toneAttrs.SetFileName(ringtoneAsset->GetDisplayName());
1718 toneAttrs.SetTitle(ringtoneAsset->GetTitle());
1719 toneAttrs.SetUri(ringtoneAsset->GetPath());
1720 if (ringtoneAsset->GetMediaType() == RINGTONE_MEDIA_TYPE_VIDEO) {
1721 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_VID);
1722 } else {
1723 toneAttrs.SetMediaType(ToneMediaType::MEDIA_TYPE_AUD);
1724 }
1725 } else {
1726 MEDIA_LOGE("GetAlarmToneAttrs: no alarmtone in the ringtone library!");
1727 }
1728 resultSet == nullptr ? : resultSet->Close();
1729 return toneAttrs;
1730 }
1731
GetDefaultAlarmToneAttrs(const std::shared_ptr<AbilityRuntime::Context> & context)1732 std::shared_ptr<ToneAttrs> SystemSoundManagerImpl::GetDefaultAlarmToneAttrs(
1733 const std::shared_ptr<AbilityRuntime::Context> &context)
1734 {
1735 MEDIA_LOGI("GetDefaultAlarmToneAttrs : Enter the getDefaultAlarmToneAttrs interface");
1736 std::lock_guard<std::mutex> lock(uriMutex_);
1737 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
1738 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1739 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr, "Create dataShare failed.");
1740 DataShare::DatashareBusinessError businessError;
1741 DataShare::DataSharePredicates queryPredicates;
1742 alarmtoneAttrs_ = nullptr;
1743 std::vector<std::string> onClause;
1744 onClause.push_back(RINGTONE_TABLE + "." + RINGTONE_COLUMN_TONE_ID + "=" +
1745 PRELOAD_CONFIG_TABLE + "." + PRELOAD_CONFIG_COLUMN_TONE_ID);
1746 queryPredicates.InnerJoin(PRELOAD_CONFIG_TABLE)->On(onClause)->EqualTo(
1747 PRELOAD_CONFIG_TABLE + "." + PRELOAD_CONFIG_COLUMN_RING_TONE_TYPE, DEFAULT_ALARM_TYPE);
1748 Uri RINGTONEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES + "&user=" +
1749 std::to_string(SystemSoundManagerUtils::GetCurrentUserId()));
1750 auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, JOIN_COLUMNS, &businessError);
1751 int32_t errCode = businessError.GetCode();
1752 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1753 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1754 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1755 MEDIA_LOGI("GetDefaultAlarmToneAttrs:errCode:%{public}d, result :%{public}d ", errCode, result);
1756 if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED ||
1757 !SystemSoundManagerUtils::GetScannerFirstParameter(RINGTONE_PARAMETER_SCANNER_FIRST_KEY, RINGTONEPARA_SIZE) ||
1758 !SystemSoundManagerUtils::CheckCurrentUser()) {
1759 dataShareHelper = SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1760 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr, "Invalid dataShare,");
1761 resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, JOIN_COLUMNS, &businessError);
1762 }
1763 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1764 CHECK_AND_RETURN_RET_LOG(results != nullptr, nullptr, "query failed, ringtone library error.");
1765 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1766 while ((ringtoneAsset != nullptr) && (TONE_TYPE_ALARM != ringtoneAsset->GetToneType())) {
1767 ringtoneAsset = results->GetNextObject();
1768 }
1769 if (ringtoneAsset != nullptr) {
1770 alarmtoneAttrs_ = std::make_shared<ToneAttrs>(ringtoneAsset->GetTitle(), ringtoneAsset->GetDisplayName(),
1771 ringtoneAsset->GetPath(), sourceTypeMap_[ringtoneAsset->GetSourceType()], TONE_CATEGORY_ALARM);
1772 MEDIA_LOGI("AlarmtoneAttrs_ :Title = %{public}s", ringtoneAsset->GetTitle().c_str());
1773 } else {
1774 MEDIA_LOGE("GetDefaultAlarmToneAttrs: no default alarmtone in the ringtone library!");
1775 }
1776 resultSet == nullptr ? : resultSet->Close();
1777 dataShareHelper->Release();
1778 return alarmtoneAttrs_;
1779 }
1780
GetAlarmToneAttrList(const std::shared_ptr<AbilityRuntime::Context> & context)1781 std::vector<std::shared_ptr<ToneAttrs>> SystemSoundManagerImpl::GetAlarmToneAttrList
1782 (const std::shared_ptr<AbilityRuntime::Context> &context)
1783 {
1784 std::lock_guard<std::mutex> lock(uriMutex_);
1785 alarmtoneAttrsArray_.clear();
1786 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
1787 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
1788 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, alarmtoneAttrsArray_,
1789 "Create dataShare failed, datashare or ringtone library error.");
1790 DataShare::DatashareBusinessError businessError;
1791 DataShare::DataSharePredicates queryPredicates;
1792 queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, to_string(TONE_TYPE_ALARM));
1793 queryPredicates.GreaterThan(RINGTONE_COLUMN_MEDIA_TYPE, to_string(RINGTONE_MEDIA_TYPE_INVALID));
1794 Uri RINGTONEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES + "&user=" +
1795 std::to_string(SystemSoundManagerUtils::GetCurrentUserId()));
1796 auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
1797 int32_t errCode = businessError.GetCode();
1798 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1799 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1800 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1801 if (errCode != 0 || result != Security::AccessToken::PermissionState::PERMISSION_GRANTED ||
1802 !SystemSoundManagerUtils::GetScannerFirstParameter(RINGTONE_PARAMETER_SCANNER_FIRST_KEY, RINGTONEPARA_SIZE) ||
1803 !SystemSoundManagerUtils::CheckCurrentUser()) {
1804 dataShareHelper = SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1805 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, alarmtoneAttrsArray_,
1806 "Invalid dataShare, datashare or ringtone library error.");
1807 resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1808 }
1809 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1810 CHECK_AND_RETURN_RET_LOG(results != nullptr, alarmtoneAttrsArray_, "query failed, ringtone library error.");
1811 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1812 while (ringtoneAsset != nullptr) {
1813 alarmtoneAttrs_ = std::make_shared<ToneAttrs>(ringtoneAsset->GetTitle(),
1814 ringtoneAsset->GetDisplayName(), ringtoneAsset->GetPath(),
1815 sourceTypeMap_[ringtoneAsset->GetSourceType()], TONE_CATEGORY_ALARM);
1816 alarmtoneAttrsArray_.push_back(alarmtoneAttrs_);
1817 ringtoneAsset = results->GetNextObject();
1818 }
1819 if (alarmtoneAttrsArray_.empty()) {
1820 MEDIA_LOGE("GetAlarmToneAttrList: no alarmtone in the ringtone library!");
1821 }
1822 resultSet == nullptr ? : resultSet->Close();
1823 dataShareHelper->Release();
1824 return alarmtoneAttrsArray_;
1825 }
1826
OpenAlarmTone(const std::shared_ptr<AbilityRuntime::Context> & context,const std::string & uri)1827 int32_t SystemSoundManagerImpl::OpenAlarmTone(const std::shared_ptr<AbilityRuntime::Context> &context,
1828 const std::string &uri)
1829 {
1830 return OpenToneUri(context, uri, TONE_TYPE_ALARM);
1831 }
1832
OpenToneUri(const std::shared_ptr<AbilityRuntime::Context> & context,const std::string & uri,int32_t toneType)1833 int32_t SystemSoundManagerImpl::OpenToneUri(const std::shared_ptr<AbilityRuntime::Context> &context,
1834 const std::string &uri, int32_t toneType)
1835 {
1836 MEDIA_LOGI("Enter the OpenToneUri interface.");
1837 std::lock_guard<std::mutex> lock(uriMutex_);
1838 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
1839 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
1840 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
1841 bool isProxy = (result == Security::AccessToken::PermissionState::PERMISSION_GRANTED &&
1842 SystemSoundManagerUtils::GetScannerFirstParameter(RINGTONE_PARAMETER_SCANNER_FIRST_KEY, RINGTONEPARA_SIZE) &&
1843 SystemSoundManagerUtils::CheckCurrentUser()) ? true : false;
1844 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = isProxy ?
1845 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID) :
1846 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1847 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR,
1848 "Failed to CreateDataShareHelper! datashare or ringtone library error.");
1849 DatabaseTool databaseTool = {true, isProxy, dataShareHelper};
1850 int32_t ret = OpenToneUri(databaseTool, uri, toneType);
1851 MEDIA_LOGI("Open tone uri: open result : %{public}d, type %{public}d, uri %{public}s,",
1852 ret, toneType, uri.c_str());
1853 dataShareHelper->Release();
1854 return ret;
1855 }
1856
OpenToneUri(const DatabaseTool & databaseTool,const std::string & uri,int32_t toneType)1857 int32_t SystemSoundManagerImpl::OpenToneUri(const DatabaseTool &databaseTool,
1858 const std::string &uri, int32_t toneType)
1859 {
1860 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
1861 MEDIA_LOGE("The database tool is not ready!");
1862 return ERROR;
1863 }
1864 if (SystemSoundManagerUtils::VerifyCustomPath(uri)) {
1865 MEDIA_LOGI("The audio uri is custom path.");
1866 return OpenCustomToneUri(uri, toneType);
1867 }
1868 DataShare::DatashareBusinessError businessError;
1869 DataShare::DataSharePredicates queryPredicates;
1870 std::vector<std::string> args = {uri, to_string(toneType)};
1871 queryPredicates.SetWhereClause(RINGTONE_COLUMN_DATA + " = ? AND " + RINGTONE_COLUMN_TONE_TYPE + " = ? ");
1872 queryPredicates.SetWhereArgs(args);
1873 std::string ringtoneLibraryUri = "";
1874 if (databaseTool.isProxy) {
1875 ringtoneLibraryUri = RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES +
1876 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
1877 } else {
1878 ringtoneLibraryUri = RINGTONE_PATH_URI;
1879 }
1880 Uri queryUri(ringtoneLibraryUri);
1881 auto resultSet = databaseTool.dataShareHelper->Query(queryUri, queryPredicates, COLUMNS, &businessError);
1882 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1883 CHECK_AND_RETURN_RET_LOG(results != nullptr, ERROR, "query failed, ringtone library error.");
1884 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1885 if (ringtoneAsset == nullptr) {
1886 MEDIA_LOGE("OpenTone: tone of uri failed!");
1887 resultSet == nullptr ? : resultSet->Close();
1888 return TYPEERROR;
1889 }
1890 int32_t fd = 0;
1891 if (databaseTool.isProxy) {
1892 std::string absFilePath;
1893 PathToRealPath(uri, absFilePath);
1894 fd = open(absFilePath.c_str(), O_RDONLY);
1895 } else {
1896 string uriStr = RINGTONE_PATH_URI + RINGTONE_SLASH_CHAR + to_string(ringtoneAsset->GetId());
1897 Uri ofUri(uriStr);
1898 fd = databaseTool.dataShareHelper->OpenFile(ofUri, "r");
1899 }
1900 resultSet == nullptr ? : resultSet->Close();
1901 return fd > 0 ? fd : ERROR;
1902 }
1903
OpenCustomToneUri(const std::string & customAudioUri,int32_t toneType)1904 int32_t SystemSoundManagerImpl::OpenCustomToneUri(const std::string &customAudioUri, int32_t toneType)
1905 {
1906 DataShare::DatashareBusinessError businessError;
1907 DataShare::DataSharePredicates queryPredicates;
1908 std::vector<std::string> args = {customAudioUri, to_string(toneType)};
1909 queryPredicates.SetWhereClause(RINGTONE_COLUMN_DATA + " = ? AND " + RINGTONE_COLUMN_TONE_TYPE + " = ? ");
1910 queryPredicates.SetWhereArgs(args);
1911 Uri ringtonePathUri(RINGTONE_PATH_URI);
1912 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
1913 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1914 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR, "Invalid dataShare");
1915 auto resultSet = dataShareHelper->Query(ringtonePathUri, queryPredicates, COLUMNS, &businessError);
1916 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1917 CHECK_AND_RETURN_RET_LOG(results != nullptr, ERROR, "query failed, ringtone library error.");
1918 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1919 if (ringtoneAsset != nullptr) {
1920 string uriStr = RINGTONE_PATH_URI + RINGTONE_SLASH_CHAR + to_string(ringtoneAsset->GetId());
1921 Uri ofUri(uriStr);
1922 int32_t fd = dataShareHelper->OpenFile(ofUri, "r");
1923 resultSet == nullptr ? : resultSet->Close();
1924 dataShareHelper->Release();
1925 return fd > 0 ? fd : ERROR;
1926 }
1927 MEDIA_LOGE("Open custom audio uri failed!");
1928 resultSet == nullptr ? : resultSet->Close();
1929 dataShareHelper->Release();
1930 return TYPEERROR;
1931 }
1932
OpenToneList(const std::vector<std::string> & uriList,SystemSoundError & errCode)1933 std::vector<std::tuple<std::string, int64_t, SystemSoundError>> SystemSoundManagerImpl::OpenToneList(
1934 const std::vector<std::string> &uriList, SystemSoundError &errCode)
1935 {
1936 MEDIA_LOGI("OpenToneList: Start, size: %{public}zu", uriList.size());
1937 std::lock_guard<std::mutex> lock(uriMutex_);
1938 std::vector<std::tuple<std::string, int64_t, SystemSoundError>> resultOfOpenList;
1939 if (uriList.size() > MAX_VECTOR_LENGTH) {
1940 errCode = ERROR_INVALID_PARAM;
1941 return resultOfOpenList;
1942 }
1943 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
1944 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1945 if (dataShareHelper == nullptr) {
1946 MEDIA_LOGE("OpenToneList: Create dataShare failed, datashare or library error!");
1947 errCode = ERROR_IO;
1948 return resultOfOpenList;
1949 }
1950 for (uint32_t i = 0; i < uriList.size(); i++) {
1951 std::tuple<string, int64_t, SystemSoundError> resultOfOpen = std::make_tuple(uriList[i], INVALID_FD, ERROR_IO);
1952 OpenOneFile(dataShareHelper, uriList[i], resultOfOpen);
1953 resultOfOpenList.push_back(resultOfOpen);
1954 }
1955 dataShareHelper->Release();
1956 errCode = ERROR_OK;
1957 return resultOfOpenList;
1958 }
1959
OpenOneFile(std::shared_ptr<DataShare::DataShareHelper> & dataShareHelper,const std::string & uri,std::tuple<std::string,int64_t,SystemSoundError> & resultOfOpen)1960 void SystemSoundManagerImpl::OpenOneFile(std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper,
1961 const std::string &uri, std::tuple<std::string, int64_t, SystemSoundError> &resultOfOpen)
1962 {
1963 DataShare::DatashareBusinessError businessError;
1964 DataShare::DataSharePredicates queryPredicates;
1965 queryPredicates.EqualTo(RINGTONE_COLUMN_DATA, uri);
1966 auto resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
1967 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
1968 if (results == nullptr) {
1969 MEDIA_LOGE("OpenOneFile: Query failed, ringtone library error!");
1970 return;
1971 }
1972 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
1973 while ((ringtoneAsset != nullptr) && (uri != ringtoneAsset->GetPath())) {
1974 ringtoneAsset = results->GetNextObject();
1975 }
1976 if (ringtoneAsset != nullptr) {
1977 string uriStr = RINGTONE_PATH_URI + RINGTONE_SLASH_CHAR + to_string(ringtoneAsset->GetId());
1978 Uri ofUri(uriStr);
1979 int32_t fd = dataShareHelper->OpenFile(ofUri, "r");
1980 resultSet == nullptr ? : resultSet->Close();
1981 if (fd > 0) {
1982 std::get<PARAM1>(resultOfOpen) = fd;
1983 std::get<PARAM2>(resultOfOpen) = ERROR_OK;
1984 } else {
1985 MEDIA_LOGE("OpenOneFile: OpenFile failed, uri: %{public}s.", uri.c_str());
1986 }
1987 return;
1988 }
1989 MEDIA_LOGE("OpenOneFile: ringtoneAsset is nullptr, uri: %{public}s.", uri.c_str());
1990 resultSet == nullptr ? : resultSet->Close();
1991 }
1992
Close(const int32_t & fd)1993 int32_t SystemSoundManagerImpl::Close(const int32_t &fd)
1994 {
1995 std::lock_guard<std::mutex> lock(uriMutex_);
1996 return close(fd);
1997 }
1998
AddCustomizedToneByExternalUri(const std::shared_ptr<AbilityRuntime::Context> & context,const std::shared_ptr<ToneAttrs> & toneAttrs,const std::string & externalUri)1999 std::string SystemSoundManagerImpl::AddCustomizedToneByExternalUri(
2000 const std::shared_ptr<AbilityRuntime::Context> &context, const std::shared_ptr<ToneAttrs> &toneAttrs,
2001 const std::string &externalUri)
2002 {
2003 MEDIA_LOGI("AddCustomizedToneByExternalUri: Start, externalUri: %{public}s", externalUri.c_str());
2004 std::string fdHead = "fd://";
2005 std::string srcPath = externalUri;
2006 int32_t srcFd = -1;
2007 bool needToCloseSrcFd = false;
2008 if (srcPath.find(fdHead) != std::string::npos) {
2009 StrToInt(srcPath.substr(fdHead.size()), srcFd);
2010 } else {
2011 srcFd = open(srcPath.c_str(), O_RDONLY);
2012 needToCloseSrcFd = (srcFd != -1);
2013 }
2014 if (srcFd < 0) {
2015 MEDIA_LOGE("AddCustomizedToneByExternalUri: fd open error is %{public}s", strerror(errno));
2016 fdHead.clear();
2017 return fdHead;
2018 }
2019 std::string result = AddCustomizedToneByFd(context, toneAttrs, srcFd);
2020 if (needToCloseSrcFd) {
2021 MEDIA_LOGI("Close src fd.");
2022 close(srcFd);
2023 }
2024 return result;
2025 }
2026
AddCustomizedToneByFd(const std::shared_ptr<AbilityRuntime::Context> & context,const std::shared_ptr<ToneAttrs> & toneAttrs,const int32_t & fd)2027 std::string SystemSoundManagerImpl::AddCustomizedToneByFd(const std::shared_ptr<AbilityRuntime::Context> &context,
2028 const std::shared_ptr<ToneAttrs> &toneAttrs, const int32_t &fd)
2029 {
2030 MEDIA_LOGI("AddCustomizedToneByFd: Start.");
2031 ParamsForAddCustomizedTone paramsForAddCustomizedTone = { "", fd, INT_MAX, 0, false };
2032 return AddCustomizedToneByFdAndOffset(context, toneAttrs, paramsForAddCustomizedTone);
2033 }
2034
GetCustomizedTone(const std::shared_ptr<ToneAttrs> & toneAttrs)2035 void SystemSoundManagerImpl::GetCustomizedTone(const std::shared_ptr<ToneAttrs> &toneAttrs)
2036 {
2037 displayName_ = toneAttrs->GetFileName();
2038 mimeType_ = "";
2039 for (const auto& type : RINGTONETYPE) {
2040 size_t found = displayName_.find("." + type);
2041 if (found != std::string::npos) {
2042 mimeType_ = type;
2043 }
2044 }
2045 if (mimeType_.empty()) {
2046 mimeType_ = RINGTONE_CONTAINER_TYPE_OGG;
2047 displayName_ = displayName_ + ".ogg";
2048 }
2049 }
2050
AddCustomizedTone(const std::shared_ptr<DataShare::DataShareHelper> & dataShareHelper,const std::shared_ptr<ToneAttrs> & toneAttrs,int32_t & length)2051 int32_t SystemSoundManagerImpl::AddCustomizedTone(const std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper,
2052 const std::shared_ptr<ToneAttrs> &toneAttrs, int32_t &length)
2053 {
2054 MEDIA_LOGI("AddCustomizedTone: Start.");
2055 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR, "Invalid dataShareHelper.");
2056 int32_t category = -1;
2057 category = toneAttrs->GetCategory();
2058 DataShareValuesBucket valuesBucket;
2059 valuesBucket.Put(RINGTONE_COLUMN_DISPLAY_NAME, static_cast<string>(displayName_));
2060 valuesBucket.Put(RINGTONE_COLUMN_TITLE, static_cast<string>(toneAttrs->GetTitle()));
2061 if (toneAttrs->GetMediaType() == ToneMediaType::MEDIA_TYPE_AUD) {
2062 valuesBucket.Put(RINGTONE_COLUMN_MEDIA_TYPE, static_cast<int>(RINGTONE_MEDIA_TYPE_AUDIO));
2063 } else if (toneAttrs->GetMediaType() == ToneMediaType::MEDIA_TYPE_VID) {
2064 valuesBucket.Put(RINGTONE_COLUMN_MEDIA_TYPE, static_cast<int>(RINGTONE_MEDIA_TYPE_VIDEO));
2065 }
2066 valuesBucket.Put(RINGTONE_COLUMN_SIZE, static_cast<int>(length));
2067 valuesBucket.Put(RINGTONE_COLUMN_MIME_TYPE, static_cast<string>(mimeType_));
2068 valuesBucket.Put(RINGTONE_COLUMN_SOURCE_TYPE, static_cast<int>(SOURCE_TYPE_CUSTOMISED));
2069 switch (category) {
2070 case TONE_CATEGORY_RINGTONE:
2071 toneAttrs->SetUri(RINGTONE_CUSTOMIZED_RINGTONE_PATH + RINGTONE_SLASH_CHAR + displayName_);
2072 valuesBucket.Put(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_RINGTONE));
2073 break;
2074 case TONE_CATEGORY_TEXT_MESSAGE:
2075 toneAttrs->SetUri(RINGTONE_CUSTOMIZED_NOTIFICATIONS_PATH + RINGTONE_SLASH_CHAR + displayName_);
2076 valuesBucket.Put(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_NOTIFICATION));
2077 break;
2078 case TONE_CATEGORY_NOTIFICATION:
2079 toneAttrs->SetUri(RINGTONE_CUSTOMIZED_NOTIFICATIONS_PATH + RINGTONE_SLASH_CHAR + displayName_);
2080 valuesBucket.Put(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_NOTIFICATION));
2081 break;
2082 case TONE_CATEGORY_ALARM:
2083 toneAttrs->SetUri(RINGTONE_CUSTOMIZED_ALARM_PATH + RINGTONE_SLASH_CHAR + displayName_);
2084 valuesBucket.Put(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_ALARM));
2085 break;
2086 case TONE_CATEGORY_CONTACTS:
2087 toneAttrs->SetUri(RINGTONE_CUSTOMIZED_CONTACTS_PATH + RINGTONE_SLASH_CHAR + displayName_);
2088 valuesBucket.Put(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_CONTACTS));
2089 MEDIA_LOGI("displayName : %{public}s", displayName_.c_str());
2090 break;
2091 default:
2092 break;
2093 }
2094 valuesBucket.Put(RINGTONE_COLUMN_DATA, static_cast<string>(toneAttrs->GetUri()));
2095 int32_t result = dataShareHelper->Insert(RINGTONEURI, valuesBucket);
2096 MEDIA_LOGI("AddCustomizedTone, result : %{public}d", result);
2097 return result;
2098 }
2099
DeleteCustomizedTone(const std::shared_ptr<DataShare::DataShareHelper> & dataShareHelper,const std::shared_ptr<ToneAttrs> & toneAttrs,int32_t & length)2100 bool SystemSoundManagerImpl::DeleteCustomizedTone(const std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper,
2101 const std::shared_ptr<ToneAttrs> &toneAttrs, int32_t &length)
2102 {
2103 MEDIA_LOGI("DeleteCustomizedTone: Start.");
2104 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR, "Invalid dataShareHelper.");
2105 int32_t category = -1;
2106 category = toneAttrs->GetCategory();
2107 DataShare::DataSharePredicates predicates;
2108 predicates.EqualTo(RINGTONE_COLUMN_DISPLAY_NAME, static_cast<string>(displayName_));
2109 predicates.EqualTo(RINGTONE_COLUMN_TITLE, static_cast<string>(toneAttrs->GetTitle()));
2110 if (toneAttrs->GetMediaType() == ToneMediaType::MEDIA_TYPE_AUD) {
2111 predicates.EqualTo(RINGTONE_COLUMN_MEDIA_TYPE, static_cast<int>(RINGTONE_MEDIA_TYPE_AUDIO));
2112 } else if (toneAttrs->GetMediaType() == ToneMediaType::MEDIA_TYPE_VID) {
2113 predicates.EqualTo(RINGTONE_COLUMN_MEDIA_TYPE, static_cast<int>(RINGTONE_MEDIA_TYPE_VIDEO));
2114 }
2115 predicates.EqualTo(RINGTONE_COLUMN_SIZE, static_cast<int>(length));
2116 predicates.EqualTo(RINGTONE_COLUMN_MIME_TYPE, static_cast<string>(mimeType_));
2117 predicates.EqualTo(RINGTONE_COLUMN_SOURCE_TYPE, static_cast<int>(SOURCE_TYPE_CUSTOMISED));
2118 switch (category) {
2119 case TONE_CATEGORY_RINGTONE:
2120 predicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_RINGTONE));
2121 break;
2122 case TONE_CATEGORY_TEXT_MESSAGE:
2123 predicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_NOTIFICATION));
2124 break;
2125 case TONE_CATEGORY_NOTIFICATION:
2126 predicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_NOTIFICATION));
2127 break;
2128 case TONE_CATEGORY_ALARM:
2129 predicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_ALARM));
2130 break;
2131 case TONE_CATEGORY_CONTACTS:
2132 predicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, static_cast<int>(TONE_TYPE_CONTACTS));
2133 break;
2134 default:
2135 break;
2136 }
2137 predicates.EqualTo(RINGTONE_COLUMN_DATA, static_cast<string>(toneAttrs->GetUri()));
2138 bool result = (dataShareHelper->Delete(RINGTONEURI, predicates) > 0);
2139 MEDIA_LOGI("DeleteCustomizedTone: displayName : %{public}s, result: %{public}d", displayName_.c_str(), result);
2140 return result;
2141 }
2142
AddCustomizedToneCheck(const std::shared_ptr<ToneAttrs> & toneAttrs,const int32_t & length)2143 std::string SystemSoundManagerImpl::AddCustomizedToneCheck(const std::shared_ptr<ToneAttrs> &toneAttrs,
2144 const int32_t &length)
2145 {
2146 std::string result = "TYPEERROR";
2147 if (toneAttrs == nullptr) {
2148 MEDIA_LOGE("AddCustomizedToneCheck: The toneAttrs is nullptr!");
2149 return result;
2150 }
2151 GetCustomizedTone(toneAttrs);
2152 if (toneAttrs->GetMediaType() == ToneMediaType::MEDIA_TYPE_VID) {
2153 if (length > MAX_FILE_SIZE_200M) {
2154 MEDIA_LOGE("AddCustomizedToneCheck: The file size exceeds 200M.");
2155 return FILE_SIZE_EXCEEDS_LIMIT;
2156 }
2157 }
2158 if (toneAttrs->GetCustomizedType() != CUSTOMISED) {
2159 MEDIA_LOGE("AddCustomizedToneCheck: The ringtone is not customized!");
2160 return result;
2161 }
2162 if (toneAttrs->GetMediaType() == ToneMediaType::MEDIA_TYPE_VID) {
2163 std::string fileName = toneAttrs->GetFileName();
2164 if (fileName.length() <= FIX_MP4.length()) {
2165 MEDIA_LOGE("AddCustomizedToneCheck: fileName length is invalid!");
2166 return result;
2167 }
2168 std::string tail = fileName.substr(fileName.length() - FIX_MP4.length(), FIX_MP4.length());
2169 if (tail != FIX_MP4) {
2170 MEDIA_LOGE("AddCustomizedToneCheck: video type, but file format is not mp4!");
2171 return result;
2172 }
2173 }
2174 return "";
2175 }
2176
AddCustomizedToneByFdAndOffset(const std::shared_ptr<AbilityRuntime::Context> & context,const std::shared_ptr<ToneAttrs> & toneAttrs,ParamsForAddCustomizedTone & paramsForAddCustomizedTone)2177 std::string SystemSoundManagerImpl::AddCustomizedToneByFdAndOffset(
2178 const std::shared_ptr<AbilityRuntime::Context> &context, const std::shared_ptr<ToneAttrs> &toneAttrs,
2179 ParamsForAddCustomizedTone ¶msForAddCustomizedTone)
2180 {
2181 MEDIA_LOGI("AddCustomizedToneByFdAndOffset: Start.");
2182 MediaTrace::TraceBegin("SystemSoundManagerImpl::AddCustomizedToneByFdAndOffset", FAKE_POINTER(this));
2183 off_t fileSize = 0;
2184 std::string checkResult = AddCustomizedToneCheck(toneAttrs, paramsForAddCustomizedTone.length);
2185 if (!checkResult.empty()) {
2186 SendCustomizedToneEvent(true, toneAttrs, fileSize, mimeType_, ERROR);
2187 MediaTrace::TraceEnd("SystemSoundManagerImpl::AddCustomizedToneByFdAndOffset", FAKE_POINTER(this));
2188 return checkResult;
2189 }
2190 std::lock_guard<std::mutex> lock(uriMutex_);
2191 int32_t srcFd = paramsForAddCustomizedTone.srcFd;
2192 off_t lseekResult = lseek(srcFd, paramsForAddCustomizedTone.offset, SEEK_SET);
2193 if (srcFd < 0 || lseekResult == -1) {
2194 MEDIA_LOGE("AddCustomizedToneByFdAndOffset: fd is error");
2195 SendCustomizedToneEvent(true, toneAttrs, paramsForAddCustomizedTone.length, mimeType_, ERROR);
2196 MediaTrace::TraceEnd("SystemSoundManagerImpl::AddCustomizedToneByFdAndOffset", FAKE_POINTER(this));
2197 return "";
2198 }
2199 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
2200 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2201 if (dataShareHelper == nullptr) {
2202 MEDIA_LOGE("AddCustomizedToneByFdAndOffset: Create dataShare failed, datashare or ringtone library error.");
2203 SendCustomizedToneEvent(true, toneAttrs, paramsForAddCustomizedTone.length, mimeType_, ERROR);
2204 MediaTrace::TraceEnd("SystemSoundManagerImpl::AddCustomizedToneByFdAndOffset", FAKE_POINTER(this));
2205 return "";
2206 }
2207 int32_t sert = AddCustomizedTone(dataShareHelper, toneAttrs, paramsForAddCustomizedTone.length);
2208 if (sert < 0) {
2209 SendCustomizedToneEvent(true, toneAttrs, paramsForAddCustomizedTone.length, mimeType_, ERROR);
2210 MediaTrace::TraceEnd("SystemSoundManagerImpl::AddCustomizedToneByFdAndOffset", FAKE_POINTER(this));
2211 std::string result = DealAddCustomizedToneError(sert, paramsForAddCustomizedTone, toneAttrs, dataShareHelper);
2212 dataShareHelper->Release();
2213 return result;
2214 }
2215 std::string dstPath = RINGTONE_PATH_URI + RINGTONE_SLASH_CHAR + to_string(sert);
2216 paramsForAddCustomizedTone = { dstPath, srcFd, paramsForAddCustomizedTone.length };
2217 return CustomizedToneWriteFile(dataShareHelper, toneAttrs, paramsForAddCustomizedTone);
2218 }
2219
DealAddCustomizedToneError(int32_t & sert,ParamsForAddCustomizedTone & paramsForAddCustomizedTone,const std::shared_ptr<ToneAttrs> & toneAttrs,std::shared_ptr<DataShare::DataShareHelper> & dataShareHelper)2220 std::string SystemSoundManagerImpl::DealAddCustomizedToneError(int32_t &sert,
2221 ParamsForAddCustomizedTone ¶msForAddCustomizedTone, const std::shared_ptr<ToneAttrs> &toneAttrs,
2222 std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper)
2223 {
2224 if (sert == VIDEOS_NUM_EXCEEDS_SPECIFICATION) {
2225 return FILE_COUNT_EXCEEDS_LIMIT;
2226 } else if (sert == NOT_ENOUGH_ROM) {
2227 return ROM_IS_INSUFFICIENT;
2228 } else if (sert == FILE_EXIST && toneAttrs->GetMediaType() == ToneMediaType::MEDIA_TYPE_VID) {
2229 DataShare::DatashareBusinessError businessError;
2230 DataShare::DataSharePredicates queryPredicates;
2231 queryPredicates.EqualTo(RINGTONE_COLUMN_DISPLAY_NAME, toneAttrs->GetFileName());
2232 queryPredicates.EqualTo(RINGTONE_COLUMN_TITLE, toneAttrs->GetTitle());
2233 queryPredicates.EqualTo(RINGTONE_COLUMN_SIZE, paramsForAddCustomizedTone.length);
2234 if (toneAttrs->GetCategory() == TONE_CATEGORY_RINGTONE) {
2235 queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, TONE_TYPE_RINGTONE);
2236 } else if (toneAttrs->GetCategory() == TONE_CATEGORY_CONTACTS) {
2237 queryPredicates.EqualTo(RINGTONE_COLUMN_TONE_TYPE, TONE_TYPE_CONTACTS);
2238 }
2239 auto resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
2240 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
2241 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
2242 resultSet == nullptr ? : resultSet->Close();
2243 if (ringtoneAsset == nullptr) {
2244 MEDIA_LOGE("DealAddCustomizedToneError: duplicate file name!");
2245 paramsForAddCustomizedTone.duplicateFile = true;
2246 return toneAttrs->GetUri();
2247 } else {
2248 return ringtoneAsset->GetPath();
2249 }
2250 }
2251 return "";
2252 }
2253
CustomizedToneWriteFile(std::shared_ptr<DataShare::DataShareHelper> & dataShareHelper,const std::shared_ptr<ToneAttrs> & toneAttrs,ParamsForAddCustomizedTone & paramsForAddCustomizedTone)2254 std::string SystemSoundManagerImpl::CustomizedToneWriteFile(
2255 std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper, const std::shared_ptr<ToneAttrs> &toneAttrs,
2256 ParamsForAddCustomizedTone ¶msForAddCustomizedTone)
2257 {
2258 MEDIA_LOGI("CustomizedToneWriteFile: Start.");
2259 Uri ofUri(paramsForAddCustomizedTone.dstPath);
2260 int32_t dstFd = dataShareHelper->OpenFile(ofUri, "rw");
2261 if (dstFd < 0) {
2262 MEDIA_LOGE("CustomizedToneWriteFile: Open error is %{public}s", strerror(errno));
2263 DeleteCustomizedTone(dataShareHelper, toneAttrs, paramsForAddCustomizedTone.length);
2264 dataShareHelper->Release();
2265 SendCustomizedToneEvent(true, toneAttrs, paramsForAddCustomizedTone.length, mimeType_, ERROR);
2266 MediaTrace::TraceEnd("SystemSoundManagerImpl::AddCustomizedToneByFdAndOffset", FAKE_POINTER(this));
2267 return "";
2268 }
2269 MEDIA_LOGI("CustomizedToneWriteFile: OpenFile success, begin write file.");
2270 char buffer[4096];
2271 int32_t len = paramsForAddCustomizedTone.length;
2272 memset_s(buffer, sizeof(buffer), 0, sizeof(buffer));
2273 int32_t bytesRead = 0;
2274 while ((bytesRead = read(paramsForAddCustomizedTone.srcFd, buffer, sizeof(buffer))) > 0 && len > 0) {
2275 int32_t bytesWritten = write(dstFd, buffer, (bytesRead < len) ? bytesRead : len);
2276 memset_s(buffer, sizeof(buffer), 0, sizeof(buffer));
2277 if (bytesWritten == -1) {
2278 break;
2279 }
2280 len -= bytesWritten;
2281 }
2282 MEDIA_LOGI("CustomizedToneWriteFile: Write file end.");
2283 close(dstFd);
2284 dataShareHelper->Release();
2285 SendCustomizedToneEvent(true, toneAttrs, paramsForAddCustomizedTone.length, mimeType_, SUCCESS);
2286 MediaTrace::TraceEnd("SystemSoundManagerImpl::AddCustomizedToneByFdAndOffset", FAKE_POINTER(this));
2287 return toneAttrs->GetUri();
2288 }
2289
RemoveCustomizedTone(const std::shared_ptr<AbilityRuntime::Context> & context,const std::string & uri)2290 int32_t SystemSoundManagerImpl::RemoveCustomizedTone(
2291 const std::shared_ptr<AbilityRuntime::Context> &context, const std::string &uri)
2292 {
2293 MEDIA_LOGI("RemoveCustomizedTone: uri %{public}s", uri.c_str());
2294 std::lock_guard<std::mutex> lock(uriMutex_);
2295 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
2296 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2297 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR,
2298 "RemoveCustomizedTone: Create dataShare failed, datashare or ringtone library error.");
2299 std::tuple<string, int64_t, SystemSoundError> resultOfOpen = std::make_tuple(uri, INVALID_FD, ERROR_IO);
2300 OpenOneFile(dataShareHelper, uri, resultOfOpen);
2301 int64_t srcFd = std::get<PARAM1>(resultOfOpen);
2302 off_t fileSize = 0;
2303 if (srcFd < 0) {
2304 MEDIA_LOGE("RemoveCustomizedTone: fd open error is %{public}s", strerror(errno));
2305 } else {
2306 fileSize = lseek(srcFd, 0, SEEK_END);
2307 close(srcFd);
2308 }
2309 return DoRemove(dataShareHelper, uri, fileSize);
2310 }
2311
DoRemove(std::shared_ptr<DataShare::DataShareHelper> & dataShareHelper,const std::string & uri,off_t fileSize)2312 int32_t SystemSoundManagerImpl::DoRemove(std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper,
2313 const std::string &uri, off_t fileSize)
2314 {
2315 std::shared_ptr<ToneAttrs> toneAttrs =
2316 std::make_shared<ToneAttrs>("", "", "", CUSTOMISED, TONE_CATEGORY_RINGTONE);
2317 int32_t changedRows = TYPEERROR;
2318 DataShare::DatashareBusinessError businessError;
2319 DataShare::DataSharePredicates queryPredicates;
2320 queryPredicates.EqualTo(RINGTONE_COLUMN_DATA, uri);
2321 auto resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
2322 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
2323 CHECK_AND_RETURN_RET_LOG(results != nullptr, ERROR, "DoRemove: Query failed, ringtone library error.");
2324 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
2325 std::string mimeType = "";
2326 if (ringtoneAsset == nullptr) {
2327 MEDIA_LOGE("DoRemove: Tone of uri is not in the ringtone library!");
2328 resultSet == nullptr ? : resultSet->Close();
2329 dataShareHelper->Release();
2330 SendCustomizedToneEvent(false, toneAttrs, fileSize, mimeType, ERROR);
2331 return ERROR;
2332 }
2333 while ((ringtoneAsset != nullptr) &&
2334 (SOURCE_TYPE_CUSTOMISED != ringtoneAsset->GetSourceType())) {
2335 ringtoneAsset = results->GetNextObject();
2336 }
2337 if (ringtoneAsset != nullptr) {
2338 SetToneAttrs(toneAttrs, ringtoneAsset);
2339 mimeType = ringtoneAsset->GetMimeType();
2340 DataShare::DataSharePredicates deletePredicates;
2341 deletePredicates.SetWhereClause(RINGTONE_COLUMN_TONE_ID + " = ? ");
2342 deletePredicates.SetWhereArgs({to_string(ringtoneAsset->GetId())});
2343 changedRows = dataShareHelper->Delete(RINGTONEURI, deletePredicates);
2344 } else {
2345 MEDIA_LOGE("DoRemove: the ringtone is not customized!");
2346 }
2347 resultSet == nullptr ? : resultSet->Close();
2348 dataShareHelper->Release();
2349 SendCustomizedToneEvent(false, toneAttrs, fileSize, mimeType, SUCCESS);
2350 return changedRows;
2351 }
2352
SetToneAttrs(std::shared_ptr<ToneAttrs> & toneAttrs,const unique_ptr<RingtoneAsset> & ringtoneAsset)2353 void SystemSoundManagerImpl::SetToneAttrs(std::shared_ptr<ToneAttrs> &toneAttrs,
2354 const unique_ptr<RingtoneAsset> &ringtoneAsset)
2355 {
2356 int32_t toneType = ringtoneAsset->GetToneType();
2357 if (toneType == TONE_TYPE_RINGTONE) {
2358 toneAttrs->SetCategory(TONE_CATEGORY_RINGTONE);
2359 } else if (toneType == TONE_TYPE_NOTIFICATION) {
2360 toneAttrs->SetCategory(TONE_CATEGORY_NOTIFICATION);
2361 } else if (toneType == TONE_TYPE_ALARM) {
2362 toneAttrs->SetCategory(TONE_CATEGORY_ALARM);
2363 } else if (toneType == TONE_TYPE_CONTACTS) {
2364 toneAttrs->SetCategory(TONE_CATEGORY_CONTACTS);
2365 }
2366 if (ringtoneAsset->GetMediaType() == RINGTONE_MEDIA_TYPE_VIDEO) {
2367 toneAttrs->SetMediaType(ToneMediaType::MEDIA_TYPE_VID);
2368 } else {
2369 toneAttrs->SetMediaType(ToneMediaType::MEDIA_TYPE_AUD);
2370 }
2371 }
2372
RemoveCustomizedToneList(const std::vector<std::string> & uriList,SystemSoundError & errCode)2373 std::vector<std::pair<std::string, SystemSoundError>> SystemSoundManagerImpl::RemoveCustomizedToneList(
2374 const std::vector<std::string> &uriList, SystemSoundError &errCode)
2375 {
2376 MEDIA_LOGI("RemoveCustomizedToneList: Start, size: %{public}zu.", uriList.size());
2377 std::vector<std::pair<std::string, SystemSoundError>> removeResults;
2378 if (uriList.size() > MAX_VECTOR_LENGTH) {
2379 errCode = ERROR_INVALID_PARAM;
2380 return removeResults;
2381 }
2382 std::shared_ptr<AbilityRuntime::Context> context;
2383 for (uint32_t i = 0; i < uriList.size(); i++) {
2384 int32_t result = RemoveCustomizedTone(context, uriList[i]);
2385 if (result > 0) {
2386 std::pair<std::string, SystemSoundError> resultPair(uriList[i], ERROR_OK);
2387 removeResults.push_back(resultPair);
2388 } else {
2389 MEDIA_LOGE("RemoveCustomizedToneList: err, uri: %{public}s.", uriList[i].c_str());
2390 std::pair<std::string, SystemSoundError> resultPair(uriList[i], ERROR_IO);
2391 removeResults.push_back(resultPair);
2392 }
2393 }
2394 errCode = ERROR_OK;
2395 return removeResults;
2396 }
2397
SetRingerMode(const AudioStandard::AudioRingerMode & ringerMode)2398 int32_t SystemSoundManagerImpl::SetRingerMode(const AudioStandard::AudioRingerMode &ringerMode)
2399 {
2400 ringerMode_.store(ringerMode);
2401 return MSERR_OK;
2402 }
2403
GetRingerMode() const2404 AudioStandard::AudioRingerMode SystemSoundManagerImpl::GetRingerMode() const
2405 {
2406 return ringerMode_.load();
2407 }
2408
ConvertToRingtoneType(ToneHapticsType toneHapticsType,RingtoneType & ringtoneType)2409 bool SystemSoundManagerImpl::ConvertToRingtoneType(ToneHapticsType toneHapticsType, RingtoneType &ringtoneType)
2410 {
2411 switch (toneHapticsType) {
2412 case ToneHapticsType::CALL_SIM_CARD_0 :
2413 ringtoneType = RINGTONE_TYPE_SIM_CARD_0;
2414 return true;
2415 case ToneHapticsType::CALL_SIM_CARD_1 :
2416 ringtoneType = RINGTONE_TYPE_SIM_CARD_1;
2417 return true;
2418 default:
2419 return false;
2420 }
2421 }
2422
ConvertToSystemToneType(ToneHapticsType toneHapticsType,SystemToneType & systemToneType)2423 bool SystemSoundManagerImpl::ConvertToSystemToneType(ToneHapticsType toneHapticsType, SystemToneType &systemToneType)
2424 {
2425 switch (toneHapticsType) {
2426 case ToneHapticsType::TEXT_MESSAGE_SIM_CARD_0 :
2427 systemToneType = SYSTEM_TONE_TYPE_SIM_CARD_0;
2428 return true;
2429 case ToneHapticsType::TEXT_MESSAGE_SIM_CARD_1 :
2430 systemToneType = SYSTEM_TONE_TYPE_SIM_CARD_1;
2431 return true;
2432 case ToneHapticsType::NOTIFICATION :
2433 systemToneType = SYSTEM_TONE_TYPE_NOTIFICATION;
2434 return true;
2435 default:
2436 return false;
2437 }
2438 }
2439
IntToToneHapticsMode(int32_t value)2440 ToneHapticsMode SystemSoundManagerImpl::IntToToneHapticsMode(int32_t value)
2441 {
2442 switch (value) {
2443 case NONE:
2444 return NONE;
2445 case SYNC:
2446 return SYNC;
2447 case NON_SYNC:
2448 return NON_SYNC;
2449 default:
2450 return NONE;
2451 }
2452 }
2453
GetCurrentToneUri(const std::shared_ptr<AbilityRuntime::Context> & context,ToneHapticsType toneHapticsType)2454 std::string SystemSoundManagerImpl::GetCurrentToneUri(const std::shared_ptr<AbilityRuntime::Context> &context,
2455 ToneHapticsType toneHapticsType)
2456 {
2457 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
2458 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
2459 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
2460 bool isProxy = (result == Security::AccessToken::PermissionState::PERMISSION_GRANTED) ? true : false;
2461 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = isProxy ?
2462 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID) :
2463 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2464 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, "",
2465 "Failed to CreateDataShareHelper! datashare or ringtone library error.");
2466 DatabaseTool databaseTool = {true, isProxy, dataShareHelper};
2467
2468 std::string currentToneUri = GetCurrentToneUri(databaseTool, toneHapticsType);
2469 dataShareHelper->Release();
2470 return currentToneUri;
2471 }
2472
GetCurrentToneUri(const DatabaseTool & databaseTool,ToneHapticsType toneHapticsType)2473 std::string SystemSoundManagerImpl::GetCurrentToneUri(const DatabaseTool &databaseTool, ToneHapticsType toneHapticsType)
2474 {
2475 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
2476 MEDIA_LOGE("The database tool is not ready!");
2477 return "";
2478 }
2479
2480 std::string currentToneUri = "";
2481 RingtoneType ringtoneType;
2482 SystemToneType systemToneType;
2483 if (ConvertToRingtoneType(toneHapticsType, ringtoneType)) {
2484 currentToneUri = GetRingtoneUri(databaseTool, ringtoneType);
2485 } else if (ConvertToSystemToneType(toneHapticsType, systemToneType)) {
2486 currentToneUri = GetSystemToneAttrs(databaseTool, systemToneType).GetUri();
2487 } else {
2488 MEDIA_LOGE("Invalid tone haptics type");
2489 }
2490 return currentToneUri;
2491 }
2492
UpdateToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & toneUri,ToneHapticsType toneHapticsType,const ToneHapticsSettings & settings)2493 int32_t SystemSoundManagerImpl::UpdateToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
2494 const std::string &toneUri, ToneHapticsType toneHapticsType, const ToneHapticsSettings &settings)
2495 {
2496 MEDIA_LOGI("UpdateToneHapticsSettings: toneUri[%{public}s], mode[%{public}d], hapticsUri[%{public}s]",
2497 toneUri.c_str(), settings.mode, settings.hapticsUri.c_str());
2498 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper_ = dataShareHelper;
2499 DataShare::DataSharePredicates queryPredicates;
2500 queryPredicates.EqualTo(SIMCARD_SETTING_COLUMN_MODE, hapticsTypeWhereArgsMap_[toneHapticsType].first);
2501 queryPredicates.And();
2502 queryPredicates.EqualTo(SIMCARD_SETTING_COLUMN_RINGTONE_TYPE, hapticsTypeWhereArgsMap_[toneHapticsType].second);
2503
2504 DataShareValuesBucket valuesBucket;
2505 valuesBucket.Put(SIMCARD_SETTING_COLUMN_TONE_FILE, toneUri);
2506 valuesBucket.Put(SIMCARD_SETTING_COLUMN_VIBRATE_FILE, settings.hapticsUri);
2507 valuesBucket.Put(SIMCARD_SETTING_COLUMN_RING_MODE, to_string(hapticsModeMap_[settings.mode]));
2508 valuesBucket.Put(SIMCARD_SETTING_COLUMN_VIBRATE_MODE, to_string(VIBRATE_TYPE_STANDARD));
2509
2510 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
2511 int32_t ret = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
2512 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
2513 if (ret != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
2514 dataShareHelper_ = SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2515 CHECK_AND_RETURN_RET_LOG(dataShareHelper_ != nullptr, IO_ERROR, "Invalid dataShare,");
2516 int32_t result = dataShareHelper_->Update(SIMCARDSETTINGURI, queryPredicates, valuesBucket);
2517 if (result > 0) {
2518 return SUCCESS;
2519 } else {
2520 MEDIA_LOGE("UpdateToneHapticsSettings: update haptics settings fail");
2521 }
2522 valuesBucket.Put(SIMCARD_SETTING_COLUMN_MODE, to_string(hapticsTypeWhereArgsMap_[toneHapticsType].first));
2523 valuesBucket.Put(SIMCARD_SETTING_COLUMN_RINGTONE_TYPE,
2524 to_string(hapticsTypeWhereArgsMap_[toneHapticsType].second));
2525 result = dataShareHelper_->Insert(SIMCARDSETTINGURI, valuesBucket);
2526 if (result <= 0) {
2527 MEDIA_LOGE("UpdateToneHapticsSettings: insert haptics settings fail");
2528 }
2529 return result > 0 ? SUCCESS : IO_ERROR;
2530 } else {
2531 Uri SIMCARDSETTINGURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_SIMCARD_SETTING + "&user=" +
2532 std::to_string(SystemSoundManagerUtils::GetCurrentUserId()));
2533 int32_t result = dataShareHelper_->Update(SIMCARDSETTINGURI_PROXY, queryPredicates, valuesBucket);
2534 if (result > 0) {
2535 return SUCCESS;
2536 }
2537 valuesBucket.Put(SIMCARD_SETTING_COLUMN_MODE, to_string(hapticsTypeWhereArgsMap_[toneHapticsType].first));
2538 valuesBucket.Put(SIMCARD_SETTING_COLUMN_RINGTONE_TYPE,
2539 to_string(hapticsTypeWhereArgsMap_[toneHapticsType].second));
2540 result = dataShareHelper_->Insert(SIMCARDSETTINGURI_PROXY, valuesBucket);
2541 if (result <= 0) {
2542 MEDIA_LOGE("UpdateToneHapticsSettings: insert haptics settings fail");
2543 }
2544 return result > 0 ? SUCCESS : IO_ERROR;
2545 }
2546 }
2547
GetSimcardSettingAssetByToneHapticsType(const DatabaseTool & databaseTool,ToneHapticsType toneHapticsType)2548 std::unique_ptr<SimcardSettingAsset> SystemSoundManagerImpl::GetSimcardSettingAssetByToneHapticsType(
2549 const DatabaseTool &databaseTool, ToneHapticsType toneHapticsType)
2550 {
2551 DataShare::DatashareBusinessError businessError;
2552 DataShare::DataSharePredicates queryPredicates;
2553 queryPredicates.EqualTo(SIMCARD_SETTING_COLUMN_MODE, hapticsTypeWhereArgsMap_[toneHapticsType].first);
2554 queryPredicates.And();
2555 queryPredicates.EqualTo(SIMCARD_SETTING_COLUMN_RINGTONE_TYPE, hapticsTypeWhereArgsMap_[toneHapticsType].second);
2556
2557 std::string ringtoneLibraryUri = "";
2558 if (databaseTool.isProxy) {
2559 ringtoneLibraryUri = RINGTONE_LIBRARY_PROXY_DATA_URI_SIMCARD_SETTING +
2560 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
2561 } else {
2562 ringtoneLibraryUri = SIMCARD_SETTING_PATH_URI;
2563 }
2564 Uri queryUri(ringtoneLibraryUri);
2565 auto resultSet = databaseTool.dataShareHelper->Query(queryUri,
2566 queryPredicates, SETTING_TABLE_COLUMNS, &businessError);
2567 auto results = make_unique<RingtoneFetchResult<SimcardSettingAsset>>(move(resultSet));
2568 unique_ptr<SimcardSettingAsset> simcardSettingAsset = results->GetFirstObject();
2569 return simcardSettingAsset;
2570 }
2571
GetToneSyncedHapticsUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & toneUri)2572 std::string SystemSoundManagerImpl::GetToneSyncedHapticsUri(
2573 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, const std::string &toneUri)
2574 {
2575 std::shared_ptr<ToneHapticsAttrs> toneHapticsAttrs;
2576 int32_t result = GetHapticsAttrsSyncedWithTone(toneUri, dataShareHelper, toneHapticsAttrs);
2577 if (result == SUCCESS && toneHapticsAttrs) {
2578 return toneHapticsAttrs->GetUri();
2579 }
2580 return "";
2581 }
2582
GetDefaultNonSyncedHapticsUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,ToneHapticsType toneHapticsType)2583 std::string SystemSoundManagerImpl::GetDefaultNonSyncedHapticsUri(
2584 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, ToneHapticsType toneHapticsType)
2585 {
2586 MEDIA_LOGD("GetDefaultNonSyncedHapticsUri: toneHapticsType %{public}d", toneHapticsType);
2587 auto toneHapticsItem = defaultToneHapticsUriMap_.find(toneHapticsType);
2588 if (toneHapticsItem == defaultToneHapticsUriMap_.end()) {
2589 MEDIA_LOGE("GetDefaultNonSyncedHapticsUri: get type %{public}d defaultTone haptics fail", toneHapticsType);
2590 return "";
2591 }
2592
2593 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, "",
2594 "Create dataShare failed, datashare or ringtone library error.");
2595
2596 DataShare::DatashareBusinessError businessError;
2597 DataShare::DataSharePredicates queryPredicatesByUri;
2598 queryPredicatesByUri.EqualTo(VIBRATE_COLUMN_DISPLAY_NAME, toneHapticsItem->second);
2599 queryPredicatesByUri.And();
2600 queryPredicatesByUri.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE, VIBRATE_TYPE_STANDARD);
2601 Uri VIBRATEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_VIBATE_FILES + "&user=" +
2602 std::to_string(SystemSoundManagerUtils::GetCurrentUserId()));
2603 auto resultSetByUri = dataShareHelper->Query(VIBRATEURI_PROXY, queryPredicatesByUri, VIBRATE_TABLE_COLUMNS,
2604 &businessError);
2605 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
2606 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
2607 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
2608 MEDIA_LOGI("systemsoundmanagerimpl result :%{public}d ", result);
2609 if (result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
2610 dataShareHelper = SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2611 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, "",
2612 "Invalid dataShare, datashare or ringtone library error.");
2613 resultSetByUri = dataShareHelper->Query(VIBRATEURI, queryPredicatesByUri,
2614 VIBRATE_TABLE_COLUMNS, &businessError);
2615 }
2616 auto resultsByUri = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSetByUri));
2617 unique_ptr<VibrateAsset> vibrateAssetByUri = resultsByUri->GetFirstObject();
2618 if (vibrateAssetByUri == nullptr) {
2619 MEDIA_LOGE("GetDefaultNonSyncedHapticsUri: no non_sync vibration called %{public}s",
2620 toneHapticsItem->second.c_str());
2621 return "";
2622 }
2623
2624 string hapticsUri = vibrateAssetByUri->GetPath();
2625 MEDIA_LOGI("GetDefaultNonSyncedHapticsUri: toneHapticsType %{public}d default haptics %{public}s",
2626 toneHapticsType, hapticsUri.c_str());
2627 return hapticsUri;
2628 }
2629
GetFirstNonSyncedHapticsUri()2630 std::string SystemSoundManagerImpl::GetFirstNonSyncedHapticsUri()
2631 {
2632 std::vector<std::shared_ptr<ToneHapticsAttrs>> toneHapticsAttrsArray;
2633 int32_t result = GetToneHapticsList(nullptr, false, toneHapticsAttrsArray);
2634 if (result == SUCCESS && !toneHapticsAttrsArray.empty()) {
2635 return toneHapticsAttrsArray[0]->GetUri();
2636 }
2637 return "";
2638 }
2639
GetDefaultToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & currentToneUri,ToneHapticsType toneHapticsType,ToneHapticsSettings & settings)2640 int32_t SystemSoundManagerImpl::GetDefaultToneHapticsSettings(
2641 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, const std::string ¤tToneUri,
2642 ToneHapticsType toneHapticsType, ToneHapticsSettings &settings)
2643 {
2644 settings.hapticsUri = GetToneSyncedHapticsUri(dataShareHelper, currentToneUri);
2645 if (!settings.hapticsUri.empty()) {
2646 settings.mode = ToneHapticsMode::SYNC;
2647 return SUCCESS;
2648 }
2649 settings.hapticsUri = GetDefaultNonSyncedHapticsUri(dataShareHelper, toneHapticsType);
2650 if (!settings.hapticsUri.empty()) {
2651 settings.mode = ToneHapticsMode::NON_SYNC;
2652 return SUCCESS;
2653 }
2654 settings.hapticsUri = GetFirstNonSyncedHapticsUri();
2655 if (!settings.hapticsUri.empty()) {
2656 settings.mode = ToneHapticsMode::NON_SYNC;
2657 return SUCCESS;
2658 }
2659 return IO_ERROR;
2660 }
2661
GetToneHapticsSettings(const std::shared_ptr<AbilityRuntime::Context> & context,ToneHapticsType toneHapticsType,ToneHapticsSettings & settings)2662 int32_t SystemSoundManagerImpl::GetToneHapticsSettings(const std::shared_ptr<AbilityRuntime::Context> &context,
2663 ToneHapticsType toneHapticsType, ToneHapticsSettings &settings)
2664 {
2665 #ifdef SUPPORT_VIBRATOR
2666 CHECK_AND_RETURN_RET_LOG(IsToneHapticsTypeValid(toneHapticsType), IO_ERROR, "Invalid tone haptics type");
2667
2668 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
2669 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
2670 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
2671 bool isProxy = (result == Security::AccessToken::PermissionState::PERMISSION_GRANTED) ? true : false;
2672 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = isProxy ?
2673 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID) :
2674 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2675 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR,
2676 "Failed to CreateDataShareHelper! datashare or ringtone library error.");
2677 DatabaseTool databaseTool = {true, isProxy, dataShareHelper};
2678
2679 string currentToneUri = GetCurrentToneUri(databaseTool, toneHapticsType);
2680
2681 result = GetToneHapticsSettings(databaseTool, currentToneUri, toneHapticsType, settings);
2682 dataShareHelper->Release();
2683 return result;
2684 #endif
2685 return UNSUPPORTED_ERROR;
2686 }
2687
GetToneHapticsSettings(const DatabaseTool & databaseTool,const std::string & toneUri,ToneHapticsType toneHapticsType,ToneHapticsSettings & settings)2688 int32_t SystemSoundManagerImpl::GetToneHapticsSettings(const DatabaseTool &databaseTool, const std::string &toneUri,
2689 ToneHapticsType toneHapticsType, ToneHapticsSettings &settings)
2690 {
2691 #ifdef SUPPORT_VIBRATOR
2692 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
2693 MEDIA_LOGE("The database tool is not ready!");
2694 return IO_ERROR;
2695 }
2696 if (toneUri.empty() || !IsToneHapticsTypeValid(toneHapticsType)) {
2697 MEDIA_LOGE("GetToneHapticsSettings: param fail");
2698 return IO_ERROR;
2699 }
2700
2701 std::lock_guard<std::mutex> lock(toneHapticsMutex_);
2702 MEDIA_LOGI("GetToneHapticsSettings: toneUri %{public}s toneHapticsType %{public}d", toneUri.c_str(),
2703 toneHapticsType);
2704
2705 int32_t result = SUCCESS;
2706 auto simcardSettingAsset = GetSimcardSettingAssetByToneHapticsType(databaseTool, toneHapticsType);
2707
2708 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = databaseTool.dataShareHelper;
2709 if (simcardSettingAsset == nullptr || simcardSettingAsset->GetToneFile().empty()) {
2710 result = GetDefaultToneHapticsSettings(dataShareHelper, toneUri, toneHapticsType, settings);
2711 if (result != SUCCESS) {
2712 MEDIA_LOGE("GetToneHapticsSettings: get defaultTone haptics settings fail");
2713 }
2714 return result;
2715 }
2716
2717 if (toneUri == simcardSettingAsset->GetToneFile()) {
2718 settings.hapticsUri = simcardSettingAsset->GetVibrateFile();
2719 settings.mode = IntToToneHapticsMode(simcardSettingAsset->GetRingMode());
2720 return SUCCESS;
2721 }
2722
2723 if (simcardSettingAsset->GetRingMode() != VIBRATE_PLAYMODE_SYNC) {
2724 settings.hapticsUri = simcardSettingAsset->GetVibrateFile();
2725 settings.mode = IntToToneHapticsMode(simcardSettingAsset->GetRingMode());
2726 } else {
2727 result = GetDefaultToneHapticsSettings(dataShareHelper, toneUri, toneHapticsType, settings);
2728 }
2729 if (result == SUCCESS) {
2730 MEDIA_LOGI("GetDefaultToneHapticsSettings: get defaultTone haptics settings success");
2731 } else {
2732 MEDIA_LOGE("GetToneHapticsSettings: get defaultTone haptics settings fail");
2733 }
2734 return result;
2735 #endif
2736 return UNSUPPORTED_ERROR;
2737 }
2738
SetToneHapticsSettings(const std::shared_ptr<AbilityRuntime::Context> & context,ToneHapticsType toneHapticsType,const ToneHapticsSettings & settings)2739 int32_t SystemSoundManagerImpl::SetToneHapticsSettings(const std::shared_ptr<AbilityRuntime::Context> &context,
2740 ToneHapticsType toneHapticsType, const ToneHapticsSettings &settings)
2741 {
2742 #ifdef SUPPORT_VIBRATOR
2743 CHECK_AND_RETURN_RET_LOG(IsToneHapticsTypeValid(toneHapticsType), OPERATION_ERROR, "Invalid tone haptics type");
2744 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
2745 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2746 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR,
2747 "Create dataShare failed, datashare or ringtone library error.");
2748 string currentToneUri = GetCurrentToneUri(context, toneHapticsType);
2749
2750 int32_t res = SetToneHapticsSettings(dataShareHelper, currentToneUri, toneHapticsType, settings);
2751 dataShareHelper->Release();
2752 return res;
2753 #endif
2754 return UNSUPPORTED_ERROR;
2755 }
2756
SetToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & toneUri,ToneHapticsType toneHapticsType,const ToneHapticsSettings & settings)2757 int32_t SystemSoundManagerImpl::SetToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
2758 const std::string &toneUri, ToneHapticsType toneHapticsType, const ToneHapticsSettings &settings)
2759 {
2760 #ifdef SUPPORT_VIBRATOR
2761 std::lock_guard<std::mutex> lock(toneHapticsMutex_);
2762 MEDIA_LOGI("SetToneHapticsSettings: toneUri %{public}s type %{public}d hapticsUri %{public}s mode %{public}d",
2763 toneUri.c_str(), toneHapticsType, settings.hapticsUri.c_str(), settings.mode);
2764 if (dataShareHelper == nullptr || toneUri.empty() || !IsToneHapticsTypeValid(toneHapticsType)) {
2765 MEDIA_LOGE("SetToneHapticsSettings: param fail");
2766 return IO_ERROR;
2767 }
2768 ToneHapticsSettings updateSettings = settings;
2769 if (updateSettings.mode == ToneHapticsMode::NON_SYNC) {
2770 DataShare::DatashareBusinessError businessError;
2771 DataShare::DataSharePredicates queryPredicatesByUri;
2772 queryPredicatesByUri.EqualTo(VIBRATE_COLUMN_DATA, updateSettings.hapticsUri);
2773 queryPredicatesByUri.And();
2774 queryPredicatesByUri.EqualTo(VIBRATE_COLUMN_PLAY_MODE, hapticsModeMap_[updateSettings.mode]);
2775 Uri VIBRATEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_VIBATE_FILES + "&user=" +
2776 std::to_string(SystemSoundManagerUtils::GetCurrentUserId()));
2777 auto resultSetByUri = dataShareHelper->Query(VIBRATEURI_PROXY, queryPredicatesByUri, VIBRATE_TABLE_COLUMNS,
2778 &businessError);
2779 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
2780 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
2781 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
2782 if (result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
2783 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
2784 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2785 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR, "Invalid dataShare");
2786 resultSetByUri = dataShareHelper->Query(VIBRATEURI, queryPredicatesByUri,
2787 VIBRATE_TABLE_COLUMNS, &businessError);
2788 }
2789 auto resultsByUri = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSetByUri));
2790 unique_ptr<VibrateAsset> vibrateAssetByUri = resultsByUri->GetFirstObject();
2791 CHECK_AND_RETURN_RET_LOG(vibrateAssetByUri != nullptr, OPERATION_ERROR,
2792 "SetToneHapticsSettings: vibration of uri is not in the ringtone library!");
2793 } else if (settings.mode == ToneHapticsMode::SYNC) {
2794 std::shared_ptr<ToneHapticsAttrs> toneHapticsAttrs;
2795 int32_t result = GetHapticsAttrsSyncedWithTone(toneUri, dataShareHelper, toneHapticsAttrs);
2796 if (result != SUCCESS) {
2797 return result;
2798 }
2799 updateSettings.hapticsUri = toneHapticsAttrs->GetUri();
2800 }
2801
2802 int32_t res = UpdateToneHapticsSettings(dataShareHelper, toneUri, toneHapticsType, updateSettings);
2803 if (res != SUCCESS) {
2804 MEDIA_LOGE("SetToneHapticsSettings: set tone haptics settings fail!");
2805 }
2806 return res;
2807 #endif
2808 return UNSUPPORTED_ERROR;
2809 }
2810
GetToneHapticsList(const std::shared_ptr<AbilityRuntime::Context> & context,bool isSynced,std::vector<std::shared_ptr<ToneHapticsAttrs>> & toneHapticsAttrsArray)2811 int32_t SystemSoundManagerImpl::GetToneHapticsList(const std::shared_ptr<AbilityRuntime::Context> &context,
2812 bool isSynced, std::vector<std::shared_ptr<ToneHapticsAttrs>> &toneHapticsAttrsArray)
2813 {
2814 #ifdef SUPPORT_VIBRATOR
2815 MEDIA_LOGI("GetToneHapticsList: get vibration list, type : %{public}s.", isSynced ? "sync" : "non sync");
2816 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
2817 SystemSoundManagerUtils::CreateDataShareHelperUri(STORAGE_MANAGER_MANAGER_ID);
2818 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR,
2819 "Create dataShare failed, datashare or ringtone library error.");
2820
2821 DataShare::DatashareBusinessError businessError;
2822 DataShare::DataSharePredicates queryPredicates;
2823 queryPredicates.BeginWrap();
2824 queryPredicates.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE, VIBRATE_TYPE_STANDARD);
2825 queryPredicates.Or();
2826 queryPredicates.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE, VIBRATE_TYPE_SALARM);
2827 queryPredicates.Or();
2828 queryPredicates.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE, VIBRATE_TYPE_SRINGTONE);
2829 queryPredicates.Or();
2830 queryPredicates.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE, VIBRATE_TYPE_SNOTIFICATION);
2831 queryPredicates.EndWrap();
2832 queryPredicates.And();
2833 queryPredicates.EqualTo(VIBRATE_COLUMN_PLAY_MODE,
2834 std::to_string(isSynced ? VIBRATE_PLAYMODE_SYNC : VIBRATE_PLAYMODE_CLASSIC));
2835 Uri VIBRATEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_VIBATE_FILES + "&user=" +
2836 std::to_string(SystemSoundManagerUtils::GetCurrentUserId()));
2837 auto resultSet = dataShareHelper->Query(VIBRATEURI_PROXY, queryPredicates, VIBRATE_TABLE_COLUMNS, &businessError);
2838 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
2839 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
2840 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
2841 if (result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
2842 dataShareHelper = SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2843 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR, "Invalid dataShare,");
2844 resultSet = dataShareHelper->Query(VIBRATEURI, queryPredicates, VIBRATE_TABLE_COLUMNS, &businessError);
2845 }
2846 auto results = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSet));
2847
2848 toneHapticsAttrsArray.clear();
2849 unique_ptr<VibrateAsset> vibrateAsset = results->GetFirstObject();
2850 if (vibrateAsset == nullptr) {
2851 MEDIA_LOGE("GetToneHapticsList: get %{public}s vibration list fail!", isSynced ? "sync" : "non sync");
2852 } else {
2853 while (vibrateAsset != nullptr) {
2854 auto toneHapticsAttrs = std::make_shared<ToneHapticsAttrs>(vibrateAsset->GetTitle(),
2855 vibrateAsset->GetDisplayName(), vibrateAsset->GetPath());
2856 toneHapticsAttrsArray.push_back(toneHapticsAttrs);
2857 vibrateAsset = results->GetNextObject();
2858 }
2859 }
2860
2861 dataShareHelper->Release();
2862 return toneHapticsAttrsArray.empty() ? IO_ERROR : SUCCESS;
2863 #endif
2864 return UNSUPPORTED_ERROR;
2865 }
2866
ConvertToHapticsFileName(const std::string & fileName)2867 std::string SystemSoundManagerImpl::ConvertToHapticsFileName(const std::string &fileName)
2868 {
2869 size_t dotPos = fileName.find_last_of('.');
2870 if (dotPos != std::string::npos) {
2871 std::string baseName = fileName.substr(0, dotPos);
2872 return baseName + ".json";
2873 } else {
2874 return fileName + ".json";
2875 }
2876 }
2877
IsPresetRingtone(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,const std::string & toneUri)2878 std::unique_ptr<RingtoneAsset> SystemSoundManagerImpl::IsPresetRingtone(
2879 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, const std::string &toneUri)
2880 {
2881 DataShare::DatashareBusinessError businessError;
2882 DataShare::DataSharePredicates queryPredicates;
2883 queryPredicates.EqualTo(RINGTONE_COLUMN_DATA, toneUri);
2884 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
2885 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
2886 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
2887 MEDIA_LOGI("the Permissions result :%{public}d ", result);
2888 if (result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
2889 dataShareHelper = SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2890 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, nullptr, "Invalid dataShare.");
2891 auto resultSet = dataShareHelper->Query(RINGTONEURI, queryPredicates, COLUMNS, &businessError);
2892 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
2893 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
2894 if (ringtoneAsset == nullptr) {
2895 MEDIA_LOGE("IsPresetRingtone: toneUri[%{public}s] inexistence in the ringtone library!", toneUri.c_str());
2896 return nullptr;
2897 }
2898 if (ringtoneAsset->GetSourceType() != SOURCE_TYPE_PRESET) {
2899 MEDIA_LOGE("IsPresetRingtone: toneUri[%{public}s] is not system prefabrication!", toneUri.c_str());
2900 return nullptr;
2901 }
2902 resultSet == nullptr ? : resultSet->Close();
2903 dataShareHelper->Release();
2904 return ringtoneAsset;
2905 } else {
2906 Uri RINGTONEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES + "&user=" +
2907 std::to_string(SystemSoundManagerUtils::GetCurrentUserId()));
2908 auto resultSet = dataShareHelper->Query(RINGTONEURI_PROXY, queryPredicates, COLUMNS, &businessError);
2909 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
2910 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
2911 if (ringtoneAsset == nullptr) {
2912 MEDIA_LOGE("IsPresetRingtone: toneUri[%{public}s] inexistence in the ringtone library!", toneUri.c_str());
2913 return nullptr;
2914 }
2915 if (ringtoneAsset->GetSourceType() != SOURCE_TYPE_PRESET) {
2916 MEDIA_LOGE("IsPresetRingtone: toneUri[%{public}s] is not system prefabrication!", toneUri.c_str());
2917 return nullptr;
2918 }
2919 return ringtoneAsset;
2920 }
2921 }
2922
GetStandardVibrateType(int toneType)2923 int SystemSoundManagerImpl::GetStandardVibrateType(int toneType)
2924 {
2925 switch (toneType) {
2926 case TONE_TYPE_ALARM:
2927 return VIBRATE_TYPE_SALARM;
2928 case TONE_TYPE_RINGTONE:
2929 return VIBRATE_TYPE_SRINGTONE;
2930 case TONE_TYPE_NOTIFICATION:
2931 return VIBRATE_TYPE_SNOTIFICATION;
2932 default:
2933 return VIBRATE_TYPE_STANDARD;
2934 }
2935 }
2936
GetHapticsAttrsSyncedWithTone(const std::shared_ptr<AbilityRuntime::Context> & context,const std::string & toneUri,std::shared_ptr<ToneHapticsAttrs> & toneHapticsAttrs)2937 int32_t SystemSoundManagerImpl::GetHapticsAttrsSyncedWithTone(const std::shared_ptr<AbilityRuntime::Context> &context,
2938 const std::string &toneUri, std::shared_ptr<ToneHapticsAttrs> &toneHapticsAttrs)
2939 {
2940 #ifdef SUPPORT_VIBRATOR
2941 CHECK_AND_RETURN_RET_LOG(!toneUri.empty(), OPERATION_ERROR, "Invalid toneUri");
2942 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
2943 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2944 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR,
2945 "Create dataShare failed, datashare or ringtone library error.");
2946
2947 int32_t result = GetHapticsAttrsSyncedWithTone(toneUri, dataShareHelper, toneHapticsAttrs);
2948 dataShareHelper->Release();
2949 return result;
2950 #endif
2951 return UNSUPPORTED_ERROR;
2952 }
2953
GetHapticsAttrsSyncedWithTone(const std::string & toneUri,std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,std::shared_ptr<ToneHapticsAttrs> & toneHapticsAttrs)2954 int32_t SystemSoundManagerImpl::GetHapticsAttrsSyncedWithTone(const std::string &toneUri,
2955 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, std::shared_ptr<ToneHapticsAttrs> &toneHapticsAttrs)
2956 {
2957 #ifdef SUPPORT_VIBRATOR
2958 MEDIA_LOGI("GetHapticsAttrsSyncedWithTone: get %{public}s sync vibration.", toneUri.c_str());
2959 if (dataShareHelper == nullptr || toneUri.empty()) {
2960 MEDIA_LOGE("GetHapticsAttrsSyncedWithTone: param fail");
2961 return IO_ERROR;
2962 }
2963
2964 unique_ptr<RingtoneAsset> ringtoneAsset = IsPresetRingtone(dataShareHelper, toneUri);
2965 if (ringtoneAsset == nullptr) {
2966 MEDIA_LOGE("GetHapticsAttrsSyncedWithTone: toneUri[%{public}s] is not presetRingtone!", toneUri.c_str());
2967 return OPERATION_ERROR;
2968 }
2969
2970 DataShare::DatashareBusinessError businessError;
2971 DataShare::DataSharePredicates vibrateQueryPredicates;
2972 vibrateQueryPredicates.EqualTo(VIBRATE_COLUMN_DISPLAY_NAME,
2973 ConvertToHapticsFileName(ringtoneAsset->GetDisplayName()));
2974 vibrateQueryPredicates.And();
2975 vibrateQueryPredicates.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE,
2976 GetStandardVibrateType(ringtoneAsset->GetToneType()));
2977 vibrateQueryPredicates.And();
2978 vibrateQueryPredicates.EqualTo(VIBRATE_COLUMN_PLAY_MODE, VIBRATE_PLAYMODE_SYNC);
2979 Uri VIBRATEURI_PROXY(RINGTONE_LIBRARY_PROXY_DATA_URI_VIBATE_FILES + "&user=" +
2980 std::to_string(SystemSoundManagerUtils::GetCurrentUserId()));
2981 auto vibrateResultSet = dataShareHelper->Query(VIBRATEURI_PROXY, vibrateQueryPredicates, VIBRATE_TABLE_COLUMNS,
2982 &businessError);
2983 Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID();
2984 int32_t result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenCaller,
2985 "ohos.permission.ACCESS_CUSTOM_RINGTONE");
2986 MEDIA_LOGI("systemsoundmanagerimpl result :%{public}d ", result);
2987 if (result != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
2988 dataShareHelper = SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2989 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR,
2990 "Invalid dataShare, datashare or ringtone library error.");
2991 vibrateResultSet = dataShareHelper->Query(VIBRATEURI, vibrateQueryPredicates,
2992 VIBRATE_TABLE_COLUMNS, &businessError);
2993 }
2994 auto vibrateResults = make_unique<RingtoneFetchResult<VibrateAsset>>(move(vibrateResultSet));
2995
2996 unique_ptr<VibrateAsset> vibrateAsset = vibrateResults->GetFirstObject();
2997 if (vibrateAsset == nullptr) {
2998 MEDIA_LOGE("GetHapticsAttrsSyncedWithTone: toneUri[%{public}s] is not sync vibration!", toneUri.c_str());
2999 return IO_ERROR;
3000 }
3001
3002 toneHapticsAttrs = std::make_shared<ToneHapticsAttrs>(vibrateAsset->GetTitle(), vibrateAsset->GetDisplayName(),
3003 vibrateAsset->GetPath());
3004 return SUCCESS;
3005 #endif
3006 return UNSUPPORTED_ERROR;
3007 }
3008
OpenToneHaptics(const std::shared_ptr<AbilityRuntime::Context> & context,const std::string & hapticsUri)3009 int32_t SystemSoundManagerImpl::OpenToneHaptics(const std::shared_ptr<AbilityRuntime::Context> &context,
3010 const std::string &hapticsUri)
3011 {
3012 #ifdef SUPPORT_VIBRATOR
3013 CHECK_AND_RETURN_RET_LOG(!hapticsUri.empty(), OPERATION_ERROR, "Invalid hapticsUri");
3014 MEDIA_LOGI("OpenToneHaptics: open %{public}s vibration.", hapticsUri.c_str());
3015 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
3016 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
3017 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, IO_ERROR,
3018 "Create dataShare failed, datashare or ringtone library error.");
3019
3020 DataShare::DatashareBusinessError businessError;
3021 DataShare::DataSharePredicates queryPredicatesByUri;
3022 queryPredicatesByUri.EqualTo(VIBRATE_COLUMN_DATA, hapticsUri);
3023 auto resultSetByUri = dataShareHelper->Query(VIBRATEURI, queryPredicatesByUri, VIBRATE_TABLE_COLUMNS,
3024 &businessError);
3025 auto resultsByUri = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSetByUri));
3026 unique_ptr<VibrateAsset> vibrateAssetByUri = resultsByUri->GetFirstObject();
3027 if (vibrateAssetByUri == nullptr) {
3028 MEDIA_LOGE("OpenToneHaptics: vibration of uri is not in the ringtone library!");
3029 dataShareHelper->Release();
3030 return OPERATION_ERROR;
3031 }
3032
3033 string uriStr = VIBRATE_PATH_URI + RINGTONE_SLASH_CHAR + to_string(vibrateAssetByUri->GetId());
3034 Uri ofUri(uriStr);
3035 int32_t fd = dataShareHelper->OpenFile(ofUri, "r");
3036 dataShareHelper->Release();
3037 return fd > 0 ? fd : IO_ERROR;
3038 #endif
3039 return UNSUPPORTED_ERROR;
3040 }
3041
GetVibrateTypeByStyle(int standardVibrateType,HapticsStyle hapticsStyle,int & vibrateType)3042 bool SystemSoundManagerImpl::GetVibrateTypeByStyle(int standardVibrateType, HapticsStyle hapticsStyle,
3043 int &vibrateType)
3044 {
3045 auto standardVibrateTypeEntry = hapticsStyleMap_.find(standardVibrateType);
3046 if (standardVibrateTypeEntry == hapticsStyleMap_.end()) {
3047 MEDIA_LOGE("GetVibrateType: input type [%{public}d] is not standardVibrateType!", standardVibrateType);
3048 return false;
3049 }
3050 auto hapticsStyleEntry = standardVibrateTypeEntry->second.find(hapticsStyle);
3051 if (hapticsStyleEntry == standardVibrateTypeEntry->second.end()) {
3052 MEDIA_LOGE("GetVibrateType: not have %{public}d haptics Style", hapticsStyle);
3053 return false;
3054 }
3055 vibrateType = hapticsStyleEntry->second;
3056 MEDIA_LOGI("GetVibrateType: standard %{public}d, style %{public}d, vibrateType %{public}d",
3057 standardVibrateType, hapticsStyle, vibrateType);
3058 return true;
3059 }
3060
GetHapticsUriByStyle(const DatabaseTool & databaseTool,const std::string & standardHapticsUri,HapticsStyle hapticsStyle)3061 std::string SystemSoundManagerImpl::GetHapticsUriByStyle(const DatabaseTool &databaseTool,
3062 const std::string &standardHapticsUri, HapticsStyle hapticsStyle)
3063 {
3064 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
3065 MEDIA_LOGE("The database tool is not ready!");
3066 return "";
3067 }
3068 if (standardHapticsUri.empty()) {
3069 MEDIA_LOGE("The standardHapticsUri is empty!");
3070 return "";
3071 }
3072 MEDIA_LOGI("GetHapticsUriByStyle: standardHapticsUri %{public}s, style %{public}d", standardHapticsUri.c_str(),
3073 hapticsStyle);
3074 std::string vibrateFilesUri = "";
3075 if (databaseTool.isProxy) {
3076 vibrateFilesUri = RINGTONE_LIBRARY_PROXY_DATA_URI_VIBATE_FILES +
3077 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
3078 } else {
3079 vibrateFilesUri = VIBRATE_PATH_URI;
3080 }
3081 Uri queryUri(vibrateFilesUri);
3082
3083 DataShare::DatashareBusinessError businessError;
3084 DataShare::DataSharePredicates queryPredicatesByUri;
3085 queryPredicatesByUri.EqualTo(VIBRATE_COLUMN_DATA, standardHapticsUri);
3086 auto resultSetByUri = databaseTool.dataShareHelper->Query(queryUri, queryPredicatesByUri,
3087 VIBRATE_TABLE_COLUMNS, &businessError);
3088 auto resultsByUri = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSetByUri));
3089 unique_ptr<VibrateAsset> vibrateAssetByUri = resultsByUri->GetFirstObject();
3090 CHECK_AND_RETURN_RET_LOG(vibrateAssetByUri != nullptr, "", "vibrateAssetByUri is nullptr.");
3091 int vibrateType = 0;
3092 bool getResult = GetVibrateTypeByStyle(vibrateAssetByUri->GetVibrateType(), hapticsStyle, vibrateType);
3093 resultSetByUri == nullptr ? : resultSetByUri->Close();
3094 if (!getResult) {
3095 return "";
3096 }
3097
3098 DataShare::DataSharePredicates queryPredicatesByDisplayName;
3099 queryPredicatesByDisplayName.EqualTo(VIBRATE_COLUMN_DISPLAY_NAME, vibrateAssetByUri->GetDisplayName());
3100 queryPredicatesByDisplayName.And();
3101 queryPredicatesByDisplayName.EqualTo(VIBRATE_COLUMN_PLAY_MODE, vibrateAssetByUri->GetPlayMode());
3102 queryPredicatesByDisplayName.And();
3103 queryPredicatesByDisplayName.EqualTo(VIBRATE_COLUMN_VIBRATE_TYPE, vibrateType);
3104 auto resultSetByDisplayName = databaseTool.dataShareHelper->Query(queryUri, queryPredicatesByDisplayName,
3105 VIBRATE_TABLE_COLUMNS, &businessError);
3106 auto resultsByDisplayName = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSetByDisplayName));
3107 unique_ptr<VibrateAsset> vibrateAssetByDisplayName = resultsByDisplayName->GetFirstObject();
3108 CHECK_AND_RETURN_RET_LOG(vibrateAssetByDisplayName != nullptr, "", "vibrateAssetByDisplayName is nullptr.");
3109
3110 std::string hapticsUri = vibrateAssetByDisplayName->GetPath();
3111 resultSetByDisplayName == nullptr ? : resultSetByDisplayName->Close();
3112 MEDIA_LOGI("get style vibration %{public}s!", hapticsUri.c_str());
3113 return hapticsUri;
3114 }
3115
SetExtRingtoneUri(const std::string & uri,const std::string & title,int32_t ringType,int32_t toneType,int32_t changedRows)3116 void SystemSoundManagerImpl::SetExtRingtoneUri(const std::string &uri, const std::string &title,
3117 int32_t ringType, int32_t toneType, int32_t changedRows)
3118 {
3119 if (changedRows <= 0) {
3120 MEDIA_LOGE("Failed to Set Uri.");
3121 return;
3122 }
3123
3124 int32_t ringtoneType = -1;
3125 if (toneType == TONE_TYPE_ALARM) {
3126 ringtoneType = EXT_TYPE_ALARMTONE;
3127 } else if (toneType == TONE_TYPE_RINGTONE) {
3128 ringtoneType = (ringType == RINGTONE_TYPE_SIM_CARD_0) ? EXT_TYPE_RINGTONE_ONE : EXT_TYPE_RINGTONE_TWO;
3129 } else if (toneType == TONE_TYPE_NOTIFICATION) {
3130 ringtoneType = (ringType == SYSTEM_TONE_TYPE_NOTIFICATION) ? EXT_TYPE_NOTIFICATION :
3131 (ringType == SYSTEM_TONE_TYPE_SIM_CARD_0) ? EXT_TYPE_MESSAGETONE_ONE : EXT_TYPE_MESSAGETONE_TWO;
3132 }
3133
3134 if (ringtoneType < 0) {
3135 MEDIA_LOGE("ringtoneType error.");
3136 return;
3137 }
3138
3139 (void)SetExtRingToneUri(uri, title, ringtoneType);
3140 }
3141
SetExtRingToneUri(const std::string & uri,const std::string & title,int32_t toneType)3142 int32_t SystemSoundManagerImpl::SetExtRingToneUri(const std::string &uri, const std::string &title, int32_t toneType)
3143 {
3144 int32_t callingUid = IPCSkeleton::GetCallingUid();
3145 CHECK_AND_RETURN_RET_LOG(callingUid != EXT_PROXY_UID, SUCCESS, "Calling from EXT, not need running.");
3146
3147 std::string serviceAudio = OHOS::system::GetParameter(EXT_SERVICE_AUDIO, "");
3148 CHECK_AND_RETURN_RET_LOG(serviceAudio != "", ERROR, "The EXT is null.");
3149 MEDIA_LOGI("SetExtRingToneUri: toneType %{public}d, title %{public}s, uri %{public}s",
3150 toneType, title.c_str(), uri.c_str());
3151
3152 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
3153 CHECK_AND_RETURN_RET_LOG(samgr != nullptr, ERROR, "SystemAbilityManager init failed.");
3154 sptr<IRemoteObject> object = samgr->CheckSystemAbility(EXT_PROXY_SID);
3155 CHECK_AND_RETURN_RET_LOG(object != nullptr, ERROR, "object is nullptr.");
3156
3157 MessageParcel data;
3158 MessageParcel reply;
3159 MessageOption option(MessageOption::TF_ASYNC);
3160 CHECK_AND_RETURN_RET_LOG(data.WriteInterfaceToken(Str8ToStr16(serviceAudio)), ERROR, "write desc failed.");
3161 CHECK_AND_RETURN_RET_LOG(data.WriteString(uri), ERROR, "write uri failed.");
3162 CHECK_AND_RETURN_RET_LOG(data.WriteString(title), ERROR, "write title failed.");
3163 CHECK_AND_RETURN_RET_LOG(data.WriteInt32(toneType), ERROR, "write toneType failed.");
3164
3165 int32_t ret = 0;
3166 ret = object->SendRequest(CMD_SET_EXT_RINGTONE_URI, data, reply, option);
3167 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "request failed, error code:%{public}d", ret);
3168
3169 ret = reply.ReadInt32();
3170 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "reply failed, error code:%{public}d", ret);
3171 MEDIA_LOGI("SetExtRingToneUri Success.");
3172 return SUCCESS;
3173 }
3174
OpenAudioUri(const DatabaseTool & databaseTool,const std::string & audioUri)3175 std::string SystemSoundManagerImpl::OpenAudioUri(const DatabaseTool &databaseTool, const std::string &audioUri)
3176 {
3177 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
3178 MEDIA_LOGE("The database tool is not ready!");
3179 return "";
3180 }
3181
3182 if (SystemSoundManagerUtils::VerifyCustomPath(audioUri)) {
3183 MEDIA_LOGI("The audio uri is custom path.");
3184 return OpenCustomAudioUri(audioUri);
3185 }
3186
3187 std::string newAudioUri = audioUri;
3188 DataShare::DatashareBusinessError businessError;
3189 DataShare::DataSharePredicates queryPredicates;
3190 vector<string> columns = {{RINGTONE_COLUMN_TONE_ID}, {RINGTONE_COLUMN_DATA}};
3191 queryPredicates.EqualTo(RINGTONE_COLUMN_DATA, audioUri);
3192
3193 std::string ringtoneLibraryUri = "";
3194 if (databaseTool.isProxy) {
3195 ringtoneLibraryUri = RINGTONE_LIBRARY_PROXY_DATA_URI_TONE_FILES +
3196 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
3197 } else {
3198 ringtoneLibraryUri = RINGTONE_PATH_URI;
3199 }
3200 Uri queryUri(ringtoneLibraryUri);
3201 auto resultSet = databaseTool.dataShareHelper->Query(queryUri, queryPredicates, columns, &businessError);
3202 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
3203 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
3204 if (ringtoneAsset == nullptr) {
3205 MEDIA_LOGE("The ringtoneAsset is nullptr!");
3206 return newAudioUri;
3207 }
3208 int32_t fd = 0;
3209 if (databaseTool.isProxy) {
3210 std::string absFilePath;
3211 PathToRealPath(audioUri, absFilePath);
3212 fd = open(absFilePath.c_str(), O_RDONLY);
3213 } else {
3214 string uriStr = RINGTONE_PATH_URI + RINGTONE_SLASH_CHAR + to_string(ringtoneAsset->GetId());
3215 Uri ofUri(uriStr);
3216 fd = databaseTool.dataShareHelper->OpenFile(ofUri, "r");
3217 }
3218 resultSet == nullptr ? : resultSet->Close();
3219
3220 if (fd > 0) {
3221 newAudioUri = FDHEAD + to_string(fd);
3222 }
3223 MEDIA_LOGI("OpenAudioUri result: newAudioUri is %{public}s", newAudioUri.c_str());
3224 return newAudioUri;
3225 }
3226
OpenCustomAudioUri(const std::string & customAudioUri)3227 std::string SystemSoundManagerImpl::OpenCustomAudioUri(const std::string &customAudioUri)
3228 {
3229 std::string newAudioUri = customAudioUri;
3230 DataShare::DatashareBusinessError businessError;
3231 DataShare::DataSharePredicates queryPredicates;
3232 vector<string> columns = {{RINGTONE_COLUMN_TONE_ID}, {RINGTONE_COLUMN_DATA}};
3233 queryPredicates.EqualTo(RINGTONE_COLUMN_DATA, customAudioUri);
3234
3235 Uri ringtonePathUri(RINGTONE_PATH_URI);
3236 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper =
3237 SystemSoundManagerUtils::CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
3238 CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, newAudioUri, "Invalid dataShare");
3239 auto resultSet = dataShareHelper->Query(ringtonePathUri, queryPredicates, columns, &businessError);
3240 auto results = make_unique<RingtoneFetchResult<RingtoneAsset>>(move(resultSet));
3241 unique_ptr<RingtoneAsset> ringtoneAsset = results->GetFirstObject();
3242 int32_t fd = 0;
3243 if (ringtoneAsset != nullptr) {
3244 string uriStr = RINGTONE_PATH_URI + RINGTONE_SLASH_CHAR + to_string(ringtoneAsset->GetId());
3245 MEDIA_LOGD("OpenCustomAudioUri: uri is %{public}s", uriStr.c_str());
3246 Uri ofUri(uriStr);
3247 fd = dataShareHelper->OpenFile(ofUri, "r");
3248 resultSet == nullptr ? : resultSet->Close();
3249 }
3250 dataShareHelper->Release();
3251 if (fd > 0) {
3252 newAudioUri = FDHEAD + to_string(fd);
3253 }
3254 MEDIA_LOGI("OpenCustomAudioUri: newAudioUri is %{public}s", newAudioUri.c_str());
3255 return newAudioUri;
3256 }
3257
OpenHapticsUri(const DatabaseTool & databaseTool,const std::string & hapticsUri)3258 std::string SystemSoundManagerImpl::OpenHapticsUri(const DatabaseTool &databaseTool, const std::string &hapticsUri)
3259 {
3260 if (!databaseTool.isInitialized || databaseTool.dataShareHelper == nullptr) {
3261 MEDIA_LOGE("The database tool is not ready!");
3262 return "";
3263 }
3264
3265 std::string newHapticsUri = hapticsUri;
3266 DataShare::DatashareBusinessError businessError;
3267 DataShare::DataSharePredicates queryPredicates;
3268 vector<string> columns = {{VIBRATE_COLUMN_VIBRATE_ID}, {VIBRATE_COLUMN_DATA}};
3269 queryPredicates.EqualTo(RINGTONE_COLUMN_DATA, hapticsUri);
3270
3271 std::string vibrateFilesUri = "";
3272 if (databaseTool.isProxy) {
3273 vibrateFilesUri = RINGTONE_LIBRARY_PROXY_DATA_URI_VIBATE_FILES +
3274 "&user=" + std::to_string(SystemSoundManagerUtils::GetCurrentUserId());
3275 } else {
3276 vibrateFilesUri = VIBRATE_PATH_URI;
3277 }
3278 Uri queryUri(vibrateFilesUri);
3279 auto resultSet = databaseTool.dataShareHelper->Query(queryUri, queryPredicates, columns, &businessError);
3280 auto results = make_unique<RingtoneFetchResult<VibrateAsset>>(move(resultSet));
3281 unique_ptr<VibrateAsset> vibrateAssetByUri = results->GetFirstObject();
3282 if (vibrateAssetByUri == nullptr) {
3283 MEDIA_LOGE("The vibrateAssetByUri is nullptr!");
3284 return newHapticsUri;
3285 }
3286 int32_t fd = 0;
3287 if (databaseTool.isProxy) {
3288 std::string absFilePath;
3289 PathToRealPath(hapticsUri, absFilePath);
3290 fd = open(absFilePath.c_str(), O_RDONLY);
3291 } else {
3292 string uriStr = VIBRATE_PATH_URI + RINGTONE_SLASH_CHAR + to_string(vibrateAssetByUri->GetId());
3293 MEDIA_LOGD("OpenHapticsUri: uri is %{public}s", uriStr.c_str());
3294 Uri ofUri(uriStr);
3295 fd = databaseTool.dataShareHelper->OpenFile(ofUri, "r");
3296 }
3297 resultSet == nullptr ? : resultSet->Close();
3298 if (fd > 0) {
3299 newHapticsUri = FDHEAD + to_string(fd);
3300 }
3301 MEDIA_LOGI("OpenHapticsUri result: newHapticsUri is %{public}s", newHapticsUri.c_str());
3302 return newHapticsUri;
3303 }
3304
SendCustomizedToneEvent(bool flag,const std::shared_ptr<ToneAttrs> & toneAttrs,off_t fileSize,std::string mimeType,int result)3305 void SystemSoundManagerImpl::SendCustomizedToneEvent(bool flag, const std::shared_ptr<ToneAttrs> &toneAttrs,
3306 off_t fileSize, std::string mimeType, int result)
3307 {
3308 auto now = std::chrono::system_clock::now();
3309 time_t rawtime = std::chrono::system_clock::to_time_t(now);
3310 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
3311 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::ADD_REMOVE_CUSTOMIZED_TONE,
3312 Media::MediaMonitor::EventType::DURATION_AGGREGATION_EVENT);
3313 bean->Add("ADD_REMOVE_OPERATION", static_cast<int32_t>(flag));
3314 MEDIA_LOGI("SendCustomizedToneEvent: operation is %{public}d(0 delete; 1 add).", flag);
3315 bean->Add("APP_NAME", GetBundleName());
3316 MEDIA_LOGI("SendCustomizedToneEvent: app name is %{public}s", GetBundleName().c_str());
3317 bean->Add("FILE_SIZE", static_cast<uint64_t>(fileSize));
3318 MEDIA_LOGI("SendCustomizedToneEvent: fileSize is %{public}ld byte, max is 200M(209715200 byte)",
3319 static_cast<long>(fileSize));
3320 bean->Add("RINGTONE_CATEGORY", toneAttrs->GetCategory());
3321 MEDIA_LOGI("SendCustomizedToneEvent: category is %{public}d"
3322 "(1 ringtone; 4 message or notification; 8 alarm; 16 contact).", toneAttrs->GetCategory());
3323 bean->Add("MEDIA_TYPE", static_cast<int32_t>(toneAttrs->GetMediaType()));
3324 MEDIA_LOGI("SendCustomizedToneEvent: mediaType is %{public}d(0 audio; 1 video).",
3325 static_cast<int32_t>(toneAttrs->GetMediaType()));
3326 bean->Add("MIME_TYPE", mimeType);
3327 MEDIA_LOGI("SendCustomizedToneEvent: mimeType is %{public}s", mimeType.c_str());
3328 bean->Add("TIMESTAMP", static_cast<uint64_t>(rawtime));
3329 bean->Add("RESULT", static_cast<int32_t>(result));
3330 MEDIA_LOGI("SendCustomizedToneEvent: result is %{public}d(0 success; -1 error).", result);
3331 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
3332 }
3333
GetBundleName()3334 std::string SystemSoundManagerImpl::GetBundleName()
3335 {
3336 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
3337 if (samgr == nullptr) {
3338 MEDIA_LOGE("Get ability manager failed.");
3339 return "";
3340 }
3341
3342 sptr<IRemoteObject> object = samgr->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
3343 if (object == nullptr) {
3344 MEDIA_LOGE("object is NULL.");
3345 return "";
3346 }
3347 sptr<AppExecFwk::IBundleMgr> bms = iface_cast<AppExecFwk::IBundleMgr>(object);
3348 if (bms == nullptr) {
3349 MEDIA_LOGE("bundle manager service is NULL.");
3350 return "";
3351 }
3352 std::string bundleName;
3353 if (bms->GetNameForUid(getuid(), bundleName)) {
3354 MEDIA_LOGE("get bundle name error.");
3355 return "";
3356 }
3357 MEDIA_LOGI("GetBundleName: bundleName is %{public}s", bundleName.c_str());
3358 return bundleName;
3359 }
3360 } // namesapce Media
3361 } // namespace OHOS
3362