• 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 #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 &paramsForAddCustomizedTone) 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 &paramsForAddCustomizedTone, 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 &currentToneUri, 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 &paramsForAddCustomizedTone);
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