• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &paramsForAddCustomizedTone)
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 &paramsForAddCustomizedTone, 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 &paramsForAddCustomizedTone)
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 &currentToneUri,
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