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 #ifndef SYSTEM_SOUND_MANAGER_IMPL_H 17 #define SYSTEM_SOUND_MANAGER_IMPL_H 18 19 #include <array> 20 21 #include "datashare_helper.h" 22 #include "data_ability_helper.h" 23 #include "ability_runtime/context/context.h" 24 #include "uri.h" 25 #include "want.h" 26 #include "audio_utils.h" 27 #include "access_token.h" 28 #include <iostream> 29 #include "system_ability_definition.h" 30 #include "ringtone_db_const.h" 31 #include "ringtone_type.h" 32 #include "ringtone_asset.h" 33 #include "simcard_setting_asset.h" 34 #include "vibrate_asset.h" 35 #include "ringtone_fetch_result.h" 36 #include "iservice_registry.h" 37 #include <unistd.h> 38 #include <fcntl.h> 39 #include <cerrno> 40 41 #include "audio_system_manager.h" 42 43 #include "system_sound_manager.h" 44 45 namespace OHOS { 46 namespace Media { 47 class RingerModeCallbackImpl; 48 49 enum HapticsStyle { 50 HAPTICS_STYLE_STANDARD = 1, 51 HAPTICS_STYLE_GENTLE, 52 }; 53 54 struct DatabaseTool { 55 bool isInitialized = false; 56 bool isProxy = false; 57 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = nullptr; 58 }; 59 60 class SystemSoundManagerImpl : public SystemSoundManager { 61 public: 62 SystemSoundManagerImpl(); 63 ~SystemSoundManagerImpl(); 64 65 int32_t SetRingerMode(const AudioStandard::AudioRingerMode &ringerMode); 66 AudioStandard::AudioRingerMode GetRingerMode() const; 67 std::string GetDefaultRingtoneUri(RingtoneType ringtoneType); 68 std::string GetDefaultSystemToneUri(SystemToneType systemToneType); 69 70 // SystemSoundManager override 71 int32_t SetRingtoneUri(const std::shared_ptr<AbilityRuntime::Context> &context, const std::string &uri, 72 RingtoneType ringtoneType) override; 73 std::string GetRingtoneUri(const std::shared_ptr<AbilityRuntime::Context> &context, 74 RingtoneType ringtoneType) override; 75 ToneAttrs GetCurrentRingtoneAttribute(RingtoneType ringtoneType) override; 76 std::shared_ptr<RingtonePlayer> GetRingtonePlayer(const std::shared_ptr<AbilityRuntime::Context> &context, 77 RingtoneType ringtoneType) override; 78 std::shared_ptr<RingtonePlayer> GetSpecificRingTonePlayer(const std::shared_ptr<AbilityRuntime::Context> &context, 79 const RingtoneType ringtoneType, std::string &ringtoneUri) override; 80 81 int32_t SetSystemToneUri(const std::shared_ptr<AbilityRuntime::Context> &context, const std::string &uri, 82 SystemToneType systemToneType) override; 83 std::string GetSystemToneUri(const std::shared_ptr<AbilityRuntime::Context> &context, 84 SystemToneType systemToneType) override; 85 std::shared_ptr<SystemTonePlayer> GetSystemTonePlayer(const std::shared_ptr<AbilityRuntime::Context> &context, 86 SystemToneType systemToneType) override; 87 88 std::shared_ptr<ToneAttrs> GetDefaultRingtoneAttrs(const std::shared_ptr<AbilityRuntime::Context> &context, 89 RingtoneType ringtoneType) override; 90 std::vector<std::shared_ptr<ToneAttrs>> GetRingtoneAttrList(const std::shared_ptr<AbilityRuntime::Context> &context, 91 RingtoneType ringtoneType) override; 92 std::shared_ptr<ToneAttrs> GetDefaultSystemToneAttrs(const std::shared_ptr<AbilityRuntime::Context> &context, 93 SystemToneType systemToneType) override; 94 std::vector<std::shared_ptr<ToneAttrs>> GetSystemToneAttrList( 95 const std::shared_ptr<AbilityRuntime::Context> &context, SystemToneType systemToneType) override; 96 std::shared_ptr<ToneAttrs> GetDefaultAlarmToneAttrs( 97 const std::shared_ptr<AbilityRuntime::Context> &context) override; 98 std::vector<std::shared_ptr<ToneAttrs>> GetAlarmToneAttrList( 99 const std::shared_ptr<AbilityRuntime::Context> &context) override; 100 std::string GetAlarmToneUri(const std::shared_ptr<AbilityRuntime::Context> &context) override; 101 int32_t SetAlarmToneUri(const std::shared_ptr<AbilityRuntime::Context> &context, const std::string &uri) override; 102 int32_t OpenAlarmTone(const std::shared_ptr<AbilityRuntime::Context> &context, const std::string &uri) override; 103 int32_t Close(const int32_t &fd) override; 104 std::string AddCustomizedToneByExternalUri(const std::shared_ptr<AbilityRuntime::Context> &context, 105 const std::shared_ptr<ToneAttrs> &toneAttrs, const std::string &externalUri) override; 106 std::string AddCustomizedToneByFd(const std::shared_ptr<AbilityRuntime::Context> &context, 107 const std::shared_ptr<ToneAttrs> &toneAttrs, const int32_t &fd) override; 108 std::string AddCustomizedToneByFdAndOffset(const std::shared_ptr<AbilityRuntime::Context> &context, 109 const std::shared_ptr<ToneAttrs> &toneAttrs, ParamsForAddCustomizedTone ¶msForAddCustomizedTone) override; 110 int32_t RemoveCustomizedTone(const std::shared_ptr<AbilityRuntime::Context> &context, 111 const std::string &uri) override; 112 std::vector<std::pair<std::string, SystemSoundError>> RemoveCustomizedToneList( 113 const std::vector<std::string> &uriList, SystemSoundError &errCode) override; 114 int32_t GetToneHapticsSettings(const std::shared_ptr<AbilityRuntime::Context> &context, 115 ToneHapticsType toneHapticsType, ToneHapticsSettings &settings) override; 116 int32_t SetToneHapticsSettings(const std::shared_ptr<AbilityRuntime::Context> &context, 117 ToneHapticsType toneHapticsType, const ToneHapticsSettings &settings) override; 118 int32_t GetToneHapticsList(const std::shared_ptr<AbilityRuntime::Context> &context, 119 bool isSynced, std::vector<std::shared_ptr<ToneHapticsAttrs>> &toneHapticsAttrsArray) override; 120 int32_t GetHapticsAttrsSyncedWithTone(const std::shared_ptr<AbilityRuntime::Context> &context, 121 const std::string &toneUri, std::shared_ptr<ToneHapticsAttrs> &toneHapticsAttrs) override; 122 int32_t OpenToneHaptics(const std::shared_ptr<AbilityRuntime::Context> &context, 123 const std::string &hapticsUri) override; 124 125 // other public functions 126 std::string GetRingtoneTitle(const std::string &ringtoneUri); 127 std::string GetRingtoneUri(const DatabaseTool &databaseTool, RingtoneType ringtoneType); 128 ToneAttrs GetRingtoneAttrs(const DatabaseTool &databaseTool, RingtoneType ringtoneType); 129 ToneAttrs GetSystemToneAttrs(SystemToneType systemToneType); 130 ToneAttrs GetSystemToneAttrs(const DatabaseTool &databaseTool, SystemToneType systemToneType); 131 ToneAttrs GetAlarmToneAttrs(const std::shared_ptr<AbilityRuntime::Context> &context); 132 std::string OpenAudioUri(const DatabaseTool &databaseTool, const std::string &audioUri); 133 std::string OpenHapticsUri(const DatabaseTool &databaseTool, const std::string &hapticsUri); 134 std::string GetHapticsUriByStyle(const DatabaseTool &databaseTool, 135 const std::string &standardHapticsUri, HapticsStyle hapticsStyle); 136 int32_t GetToneHapticsSettings(const DatabaseTool &databaseTool, const std::string &toneUri, 137 ToneHapticsType toneHapticsType, ToneHapticsSettings &settings); 138 int32_t GetHapticsAttrsSyncedWithTone(const std::string &toneUri, 139 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 140 std::shared_ptr<ToneHapticsAttrs> &toneHapticsAttrs); 141 int32_t SetToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 142 const std::string &toneUri, ToneHapticsType toneHapticsType, const ToneHapticsSettings &settings); 143 bool CheckVibrateSwitchStatus(); 144 int32_t OpenToneUri(const std::shared_ptr<AbilityRuntime::Context> &context, 145 const std::string &uri, int32_t toneType) override; 146 std::vector<std::tuple<std::string, int64_t, SystemSoundError>> OpenToneList( 147 const std::vector<std::string> &uriList, SystemSoundError &errCode) override; 148 149 private: 150 void InitDefaultUriMap(); 151 void InitDefaultRingtoneUriMap(const std::string &ringtoneJsonPath); 152 void InitDefaultSystemToneUriMap(const std::string &systemToneJsonPath); 153 void InitDefaultToneHapticsMap(); 154 void ReadDefaultToneHaptics(const char *paramName, ToneHapticsType toneHapticsType); 155 std::string GetFullPath(const std::string &originalUri); 156 std::string GetJsonValue(const std::string &jsonPath); 157 std::string OpenCustomAudioUri(const std::string &customAudioUri); 158 159 int32_t AddCustomizedTone(const std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper, 160 const std::shared_ptr<ToneAttrs> &toneAttrs, int32_t &length); 161 std::string DealAddCustomizedToneError(int32_t &sert, 162 ParamsForAddCustomizedTone ¶msForAddCustomizedTone, const std::shared_ptr<ToneAttrs> &toneAttrs, 163 std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper); 164 bool DeleteCustomizedTone(const std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper, 165 const std::shared_ptr<ToneAttrs> &toneAttrs, int32_t &length); 166 int32_t WriteUriToDatabase(const std::string &key, const std::string &uri); 167 std::string GetUriFromDatabase(const std::string &key); 168 std::string GetKeyForDatabase(const std::string &systemSoundType, int32_t type); 169 void InitRingerMode(void); 170 void GetCustomizedTone(const std::shared_ptr<ToneAttrs> &toneAttrs); 171 void InitMap(); 172 std::string GetRingtoneUriByType(const DatabaseTool &databaseTool, const std::string &type); 173 ToneAttrs GetRingtoneAttrsByType(const DatabaseTool &databaseTool, const std::string &type); 174 std::string GetPresetRingToneUriByType(const DatabaseTool &databaseTool, const std::string &type); 175 ToneAttrs GetPresetRingToneAttrByType(const DatabaseTool &databaseTool, const std::string &type); 176 int32_t SetNoRingToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 177 RingtoneType ringtoneType); 178 int32_t RemoveSourceTypeForRingTone(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 179 RingtoneType ringtoneType, SourceType sourceType); 180 int32_t UpdateRingtoneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, const int32_t &toneId, 181 RingtoneType ringtoneType, const int32_t &num); 182 std::string GetShotToneUriByType(const DatabaseTool &databaseTool, const std::string &type); 183 ToneAttrs GetShotToneAttrsByType(const DatabaseTool &databaseTool, const std::string &type); 184 std::string GetNotificationToneUriByType(const DatabaseTool &databaseTool); 185 ToneAttrs GetNotificationToneAttrsByType(const DatabaseTool &databaseTool); 186 std::string GetPresetShotToneUriByType(const DatabaseTool &databaseTool, const std::string &type); 187 ToneAttrs GetPresetShotToneAttrsByType(const DatabaseTool &databaseTool, const std::string &type); 188 std::string GetPresetNotificationToneUri(const DatabaseTool &databaseTool); 189 ToneAttrs GetPresetNotificationToneAttrs(const DatabaseTool &databaseTool); 190 ToneAttrs GetAlarmToneAttrs(const DatabaseTool &databaseTool); 191 int32_t UpdateShotToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, const int32_t &toneId, 192 SystemToneType systemToneType, const int32_t &num); 193 int32_t OpenToneUri(const DatabaseTool &databaseTool, const std::string &uri, int32_t toneType); 194 int32_t OpenCustomToneUri(const std::string &customAudioUri, int32_t toneType); 195 int32_t UpdateNotificatioToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 196 const int32_t &toneId); 197 int32_t UpdataeAlarmToneUri(const std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 198 const int32_t ringtoneAssetId); 199 int32_t SetNoSystemToneUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 200 SystemToneType systemToneType); 201 int32_t RemoveSourceTypeForSystemTone(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 202 SystemToneType systemToneType, SourceType sourceType); 203 204 bool ConvertToRingtoneType(ToneHapticsType toneHapticsType, RingtoneType &ringtoneType); 205 bool ConvertToSystemToneType(ToneHapticsType toneHapticsType, SystemToneType &systemToneType); 206 std::string ConvertToHapticsFileName(const std::string &fileName); 207 ToneHapticsMode IntToToneHapticsMode(int32_t value); 208 std::string GetCurrentToneUri(const std::shared_ptr<AbilityRuntime::Context> &context, 209 ToneHapticsType toneHapticsType); 210 std::string GetCurrentToneUri(const DatabaseTool &databaseTool, ToneHapticsType toneHapticsType); 211 std::unique_ptr<SimcardSettingAsset> GetSimcardSettingAssetByToneHapticsType(const DatabaseTool &databaseTool, 212 ToneHapticsType toneHapticsType); 213 214 std::string GetToneSyncedHapticsUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 215 const std::string &toneUri); 216 std::string GetDefaultNonSyncedHapticsUri(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 217 ToneHapticsType toneHapticsType); 218 std::string GetFirstNonSyncedHapticsUri(); 219 int32_t GetDefaultToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 220 const std::string ¤tToneUri, ToneHapticsType toneHapticsType, ToneHapticsSettings &settings); 221 222 int32_t UpdateToneHapticsSettings(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 223 const std::string &toneUri, ToneHapticsType toneHapticsType, const ToneHapticsSettings &settings); 224 bool GetVibrateTypeByStyle(int standardVibrateType, HapticsStyle hapticsStyle, int &vibrateType); 225 std::unique_ptr<RingtoneAsset> IsPresetRingtone(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 226 const std::string &toneUri); 227 int GetStandardVibrateType(int toneType); 228 229 bool IsRingtoneTypeValid(RingtoneType ringtongType); 230 bool IsSystemToneTypeValid(SystemToneType systemToneType); 231 bool IsSystemToneType(const std::unique_ptr<RingtoneAsset> &ringtoneAsset, 232 const SystemToneType &systemToneType); 233 bool IsToneHapticsTypeValid(ToneHapticsType toneHapticsType); 234 235 static Uri AssembleUri(const std::string &key, std::string tableType = ""); 236 static std::shared_ptr<DataShare::DataShareHelper> CreateDataShareHelperProxy(std::string tableType = ""); 237 int32_t GetStringValue(const std::string &key, std::string &value, std::string tableType = ""); 238 void SetExtRingtoneUri(const std::string &uri, const std::string &title, 239 int32_t ringType, int32_t toneType, int32_t changedRows); 240 int32_t SetExtRingToneUri(const std::string &uri, const std::string &title, int32_t toneType); 241 void SendCustomizedToneEvent(bool flag, const std::shared_ptr<ToneAttrs> &toneAttrs, off_t fileSize, 242 std::string mimeType, int result); 243 std::string CustomizedToneWriteFile(std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper, 244 const std::shared_ptr<ToneAttrs> &toneAttrs, ParamsForAddCustomizedTone ¶msForAddCustomizedTone); 245 void OpenOneFile(std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper, 246 const std::string &uri, std::tuple<std::string, int64_t, SystemSoundError> &resultOfOpen); 247 int32_t DoRemove(std::shared_ptr<DataShare::DataShareHelper> &dataShareHelper, const std::string &uri, 248 off_t fileSize); 249 std::string GetBundleName(); 250 std::string AddCustomizedToneCheck(const std::shared_ptr<ToneAttrs> &toneAttrs, const int32_t &length); 251 void SetToneAttrs(std::shared_ptr<ToneAttrs> &toneAttrs, const std::unique_ptr<RingtoneAsset> &ringtoneAsset); 252 253 std::string systemSoundPath_ = ""; 254 std::mutex uriMutex_; 255 std::mutex playerMutex_; 256 #ifdef SUPPORT_VIBRATOR 257 std::mutex toneHapticsMutex_; 258 #endif 259 std::string mimeType_ = ""; 260 std::string displayName_ = ""; 261 std::unordered_map<RingtoneType, std::string> defaultRingtoneUriMap_; 262 std::unordered_map<SystemToneType, std::string> defaultSystemToneUriMap_; 263 std::unordered_map<ToneHapticsType, std::string> defaultToneHapticsUriMap_; 264 std::shared_ptr<ToneAttrs> ringtoneAttrs_; 265 std::shared_ptr<ToneAttrs> systemtoneAttrs_; 266 std::shared_ptr<ToneAttrs> alarmtoneAttrs_; 267 268 std::atomic<AudioStandard::AudioRingerMode> ringerMode_ = AudioStandard::AudioRingerMode::RINGER_MODE_NORMAL; 269 std::shared_ptr<AudioStandard::AudioGroupManager> audioGroupManager_ = nullptr; 270 std::shared_ptr<AudioStandard::AudioRingerModeCallback> ringerModeCallback_ = nullptr; 271 std::vector<std::shared_ptr<ToneAttrs>> ringtoneAttrsArray_; 272 std::vector<std::shared_ptr<ToneAttrs>> systemtoneAttrsArray_; 273 std::vector<std::shared_ptr<ToneAttrs>> alarmtoneAttrsArray_; 274 }; 275 276 class RingerModeCallbackImpl : public AudioStandard::AudioRingerModeCallback { 277 public: 278 explicit RingerModeCallbackImpl(SystemSoundManagerImpl &systemSoundManagerImpl); 279 virtual ~RingerModeCallbackImpl() = default; 280 void OnRingerModeUpdated(const AudioStandard::AudioRingerMode &ringerMode) override; 281 282 private: 283 SystemSoundManagerImpl &sysSoundMgr_; 284 AudioStandard::AudioRingerMode ringerMode_ { AudioStandard::AudioRingerMode::RINGER_MODE_NORMAL }; 285 }; 286 } // namespace Media 287 } // namespace OHOS 288 #endif // SYSTEM_SOUND_MANAGER_IMPL_H 289