1 /*
2 * Copyright (C) 2024 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 "dualfwk_sound_setting.h"
17
18 #include <functional>
19 #include <string>
20 #include <unordered_map>
21
22 #include "ringtone_errno.h"
23 #include "ringtone_file_utils.h"
24 #include "ringtone_log.h"
25 #include "ringtone_type.h"
26 #include "ringtone_utils.h"
27
28 namespace OHOS {
29 namespace Media {
30 enum SettingItemType : int32_t {
31 SETTING_ITEM_INVALID = -1,
32 SETTING_ITEM_RINGTONE,
33 SETTING_ITEM_RINGTONE2,
34 SETTING_ITEM_NOTIFICATION,
35 SETTING_ITEM_ALARM,
36 SETTING_ITEM_MESSAGE,
37 SETTING_ITEM_MESSAGE2,
38 SETTING_ITEM_MAX,
39 };
40
41 enum DualFwkConfRowType : int32_t {
42 DUALFWK_CONFROW_INVALID = -1,
43 DUALFWK_CONFROW_BASE,
44 DUALFWK_CONFROW_SET,
45 DUALFWK_CONFROW_PATH,
46 DUALFWK_CONFROW_MAX,
47 };
48
49 struct DualFwkRowTypeInfo {
50 SettingItemType item;
51 DualFwkConfRowType rowType;
52 int32_t settingType;
53 int32_t toneType;
54 };
55
56 static const std::unordered_map<std::string, DualFwkRowTypeInfo> g_dualFwkInfoMap = {
57 {"notification_sound", {SETTING_ITEM_NOTIFICATION, DUALFWK_CONFROW_BASE, TONE_SETTING_TYPE_NOTIFICATION,
58 NOTIFICATION_TONE_TYPE}},
59 {"notification_sound_set", {SETTING_ITEM_NOTIFICATION, DUALFWK_CONFROW_SET, TONE_SETTING_TYPE_NOTIFICATION,
60 NOTIFICATION_TONE_TYPE}},
61 {"notification_sound_path", {SETTING_ITEM_NOTIFICATION, DUALFWK_CONFROW_PATH, TONE_SETTING_TYPE_NOTIFICATION,
62 NOTIFICATION_TONE_TYPE}},
63 {"alarm_alert", {SETTING_ITEM_ALARM, DUALFWK_CONFROW_BASE, TONE_SETTING_TYPE_ALARM, ALARM_TONE_TYPE}},
64 {"alarm_alert_set", {SETTING_ITEM_ALARM, DUALFWK_CONFROW_SET, TONE_SETTING_TYPE_ALARM, ALARM_TONE_TYPE}},
65 {"alarm_alert_path", {SETTING_ITEM_ALARM, DUALFWK_CONFROW_PATH, TONE_SETTING_TYPE_ALARM, ALARM_TONE_TYPE}},
66 {"ringtone", {SETTING_ITEM_RINGTONE, DUALFWK_CONFROW_BASE, TONE_SETTING_TYPE_RINGTONE,
67 RING_TONE_TYPE_SIM_CARD_1}},
68 {"ringtone_set", {SETTING_ITEM_RINGTONE, DUALFWK_CONFROW_SET, TONE_SETTING_TYPE_RINGTONE,
69 RING_TONE_TYPE_SIM_CARD_1}},
70 {"ringtone_path", {SETTING_ITEM_RINGTONE, DUALFWK_CONFROW_PATH, TONE_SETTING_TYPE_RINGTONE,
71 RING_TONE_TYPE_SIM_CARD_1}},
72 {"ringtone2", {SETTING_ITEM_RINGTONE2, DUALFWK_CONFROW_BASE, TONE_SETTING_TYPE_RINGTONE,
73 RING_TONE_TYPE_SIM_CARD_2}},
74 {"ringtone2_set", {SETTING_ITEM_RINGTONE2, DUALFWK_CONFROW_SET, TONE_SETTING_TYPE_RINGTONE,
75 RING_TONE_TYPE_SIM_CARD_2}},
76 {"ringtone2_path", {SETTING_ITEM_RINGTONE2, DUALFWK_CONFROW_PATH, TONE_SETTING_TYPE_RINGTONE,
77 RING_TONE_TYPE_SIM_CARD_2}},
78 {"message", {SETTING_ITEM_MESSAGE, DUALFWK_CONFROW_BASE, TONE_SETTING_TYPE_SHOT,
79 SHOT_TONE_TYPE_SIM_CARD_1}},
80 {"message_path", {SETTING_ITEM_MESSAGE, DUALFWK_CONFROW_PATH, TONE_SETTING_TYPE_SHOT,
81 SHOT_TONE_TYPE_SIM_CARD_1}},
82 {"messageSub1", {SETTING_ITEM_MESSAGE2, DUALFWK_CONFROW_BASE, TONE_SETTING_TYPE_SHOT,
83 SHOT_TONE_TYPE_SIM_CARD_2}},
84 {"messageSub1_path", {SETTING_ITEM_MESSAGE2, DUALFWK_CONFROW_PATH, TONE_SETTING_TYPE_SHOT,
85 SHOT_TONE_TYPE_SIM_CARD_2}},
86 };
87
DualFwkSoundSetting()88 DualFwkSoundSetting::DualFwkSoundSetting()
89 {}
90
SettingsTraval(std::function<void (DualFwkSettingItem &)> func)91 void DualFwkSoundSetting::SettingsTraval(std::function<void (DualFwkSettingItem &)> func)
92 {
93 for (auto setting : settings_) {
94 func(setting.second);
95 }
96 }
97
GetFileNames() const98 std::vector<std::string> DualFwkSoundSetting::GetFileNames() const
99 {
100 std::vector<std::string> fileNames;
101 for (auto setting : settings_) {
102 fileNames.push_back(setting.second.toneFileName);
103 }
104 return fileNames;
105 }
106
GetDisplayNames() const107 std::vector<std::string> DualFwkSoundSetting::GetDisplayNames() const
108 {
109 std::vector<std::string> fileNames;
110 for (auto setting : settings_) {
111 if (setting.second.isTitle) {
112 std::string fileName = RingtoneUtils::ReplaceAll(setting.second.toneFileName + ".ogg", " ", "_");
113 fileNames.push_back(fileName);
114 } else {
115 fileNames.push_back(setting.second.toneFileName);
116 }
117 }
118 return fileNames;
119 }
120
GetSettings() const121 std::vector<DualFwkSettingItem> DualFwkSoundSetting::GetSettings() const
122 {
123 std::vector<DualFwkSettingItem> settings;
124 for (auto setting : settings_) {
125 settings.push_back(setting.second);
126 }
127 return settings;
128 }
129
ProcessConfRow(std::unique_ptr<DualFwkConfRow> & conf)130 int32_t DualFwkSoundSetting::ProcessConfRow(std::unique_ptr<DualFwkConfRow> &conf)
131 {
132 int32_t ret = E_SUCCESS;
133
134 auto found = g_dualFwkInfoMap.find(conf->name);
135 if (found != g_dualFwkInfoMap.end()) {
136 if (found->second.rowType == DUALFWK_CONFROW_BASE) {
137 settings_[found->second.item].settingType = found->second.settingType;
138 settings_[found->second.item].toneType = found->second.toneType;
139 settings_[found->second.item].defaultSysSet = (conf->defaultSysSet == "true" ? true : false);
140 } else if (found->second.rowType == DUALFWK_CONFROW_SET) {
141 try {
142 settings_[found->second.item].setFlag = (std::stoi(conf->value) > 0 ? true : false);
143 } catch (const std::invalid_argument& e) {
144 settings_[found->second.item].setFlag = false;
145 RINGTONE_INFO_LOG("invalid argument: %s", e.what());
146 } catch (const std::out_of_range& e) {
147 settings_[found->second.item].setFlag = false;
148 RINGTONE_INFO_LOG("out of range: %s", e.what());
149 }
150 } else if (found->second.rowType == DUALFWK_CONFROW_PATH) {
151 settings_[found->second.item].toneFileName = RingtoneFileUtils::GetFileNameFromPath(conf->value);
152 } else {
153 ret = E_ERR;
154 }
155 } else {
156 ret = E_ERR;
157 }
158
159 return ret;
160 }
161
162
ProcessConf(const DualFwkConf & conf)163 void DualFwkSoundSetting::ProcessConf(const DualFwkConf &conf)
164 {
165 bool isTitle = false;
166 std::string toneFile;
167 if (!conf.notificationSoundPath.empty()) {
168 toneFile = RingtoneFileUtils::GetFileNameFromPathOrUri(conf.notificationSoundPath, isTitle);
169 settings_[SETTING_ITEM_NOTIFICATION] = {
170 toneFile, TONE_SETTING_TYPE_NOTIFICATION, NOTIFICATION_TONE_TYPE, false, true, isTitle
171 };
172 }
173 if (!conf.ringtonePath.empty()) {
174 toneFile = RingtoneFileUtils::GetFileNameFromPathOrUri(conf.ringtonePath, isTitle);
175 settings_[SETTING_ITEM_RINGTONE] = {
176 toneFile, TONE_SETTING_TYPE_RINGTONE, RING_TONE_TYPE_SIM_CARD_1, false, true, isTitle
177 };
178 }
179 if (!conf.ringtone2Path.empty()) {
180 toneFile = RingtoneFileUtils::GetFileNameFromPathOrUri(conf.ringtone2Path, isTitle);
181 settings_[SETTING_ITEM_RINGTONE2] = {
182 toneFile, TONE_SETTING_TYPE_RINGTONE, RING_TONE_TYPE_SIM_CARD_2, false, true, isTitle
183 };
184 }
185 if (!conf.alarmAlertPath.empty()) {
186 toneFile = RingtoneFileUtils::GetFileNameFromPathOrUri(conf.alarmAlertPath, isTitle);
187 settings_[SETTING_ITEM_ALARM] = {
188 toneFile, TONE_SETTING_TYPE_ALARM, ALARM_TONE_TYPE, false, true, isTitle
189 };
190 }
191 if (!conf.messagePath.empty()) {
192 toneFile = RingtoneFileUtils::GetFileNameFromPathOrUri(conf.messagePath, isTitle);
193 settings_[SETTING_ITEM_MESSAGE] = {
194 toneFile, TONE_SETTING_TYPE_SHOT, SHOT_TONE_TYPE_SIM_CARD_1, false, true, isTitle
195 };
196 }
197 if (!conf.messageSub1.empty()) {
198 toneFile = RingtoneFileUtils::GetFileNameFromPathOrUri(conf.messageSub1, isTitle);
199 settings_[SETTING_ITEM_MESSAGE2] = {
200 toneFile, TONE_SETTING_TYPE_SHOT, SHOT_TONE_TYPE_SIM_CARD_2, false, true, isTitle
201 };
202 }
203 }
204 } // namespace Media
205 } // namespace OHOS
206