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