• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     if (conf == nullptr) {
133         RINGTONE_ERR_LOG("invalid conf");
134         return E_ERR;
135     }
136     int32_t ret = E_SUCCESS;
137 
138     auto found = g_dualFwkInfoMap.find(conf->name);
139     if (found != g_dualFwkInfoMap.end()) {
140         if (found->second.rowType == DUALFWK_CONFROW_BASE) {
141             settings_[found->second.item].settingType = found->second.settingType;
142             settings_[found->second.item].toneType = found->second.toneType;
143             settings_[found->second.item].defaultSysSet = (conf->defaultSysSet == "true" ? true : false);
144         } else if (found->second.rowType == DUALFWK_CONFROW_SET) {
145             try {
146                 settings_[found->second.item].setFlag = (std::stoi(conf->value) > 0 ? true : false);
147             } catch (const std::invalid_argument& e) {
148                 settings_[found->second.item].setFlag = false;
149                 RINGTONE_INFO_LOG("invalid argument: %s", e.what());
150             } catch (const std::out_of_range& e) {
151                 settings_[found->second.item].setFlag = false;
152                 RINGTONE_INFO_LOG("out of range: %s", e.what());
153             }
154         } else if (found->second.rowType == DUALFWK_CONFROW_PATH) {
155             settings_[found->second.item].toneFileName = RingtoneFileUtils::GetFileNameFromPath(conf->value);
156         } else {
157             ret = E_ERR;
158         }
159     } else {
160         ret = E_ERR;
161     }
162 
163     return ret;
164 }
165 
166 
ProcessConf(const DualFwkConf & conf)167 void DualFwkSoundSetting::ProcessConf(const DualFwkConf &conf)
168 {
169     bool isTitle = false;
170     std::string toneFile;
171     if (!conf.notificationSoundPath.empty()) {
172         toneFile = RingtoneFileUtils::GetFileNameFromPathOrUri(conf.notificationSoundPath, isTitle);
173         settings_[SETTING_ITEM_NOTIFICATION] = {
174             toneFile, TONE_SETTING_TYPE_NOTIFICATION, NOTIFICATION_TONE_TYPE, false, true, isTitle
175         };
176     }
177     if (!conf.ringtonePath.empty()) {
178         toneFile = RingtoneFileUtils::GetFileNameFromPathOrUri(conf.ringtonePath, isTitle);
179         settings_[SETTING_ITEM_RINGTONE] = {
180             toneFile, TONE_SETTING_TYPE_RINGTONE, RING_TONE_TYPE_SIM_CARD_1, false, true, isTitle
181         };
182     }
183     if (!conf.ringtone2Path.empty()) {
184         toneFile = RingtoneFileUtils::GetFileNameFromPathOrUri(conf.ringtone2Path, isTitle);
185         settings_[SETTING_ITEM_RINGTONE2] = {
186             toneFile, TONE_SETTING_TYPE_RINGTONE, RING_TONE_TYPE_SIM_CARD_2, false, true, isTitle
187         };
188     }
189     if (!conf.alarmAlertPath.empty()) {
190         toneFile = RingtoneFileUtils::GetFileNameFromPathOrUri(conf.alarmAlertPath, isTitle);
191         settings_[SETTING_ITEM_ALARM] = {
192             toneFile, TONE_SETTING_TYPE_ALARM, ALARM_TONE_TYPE,  false, true, isTitle
193         };
194     }
195     if (!conf.messagePath.empty()) {
196         toneFile = RingtoneFileUtils::GetFileNameFromPathOrUri(conf.messagePath, isTitle);
197         settings_[SETTING_ITEM_MESSAGE] = {
198             toneFile, TONE_SETTING_TYPE_SHOT, SHOT_TONE_TYPE_SIM_CARD_1, false, true, isTitle
199         };
200     }
201     if (!conf.messageSub1.empty()) {
202         toneFile = RingtoneFileUtils::GetFileNameFromPathOrUri(conf.messageSub1, isTitle);
203         settings_[SETTING_ITEM_MESSAGE2] = {
204             toneFile, TONE_SETTING_TYPE_SHOT, SHOT_TONE_TYPE_SIM_CARD_2, false, true, isTitle
205         };
206     }
207 }
208 } // namespace Media
209 } // namespace OHOS
210