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 "dualfw_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 
27 namespace OHOS {
28 namespace Media {
29 enum SettingItemType : int32_t {
30     SETTING_ITEM_INVALID = -1,
31     SETTING_ITEM_RINGTONE,
32     SETTING_ITEM_RINGTONE2,
33     SETTING_ITEM_NOTIFICATION,
34     SETTING_ITEM_ALARM,
35     SETTING_ITEM_MESSAGE,
36     SETTING_ITEM_MESSAGE2,
37     SETTING_ITEM_MAX,
38 };
39 
40 enum DualfwConfRowType : int32_t {
41     DUALFW_CONFROW_INVALID = -1,
42     DUALFW_CONFROW_BASE,
43     DUALFW_CONFROW_SET,
44     DUALFW_CONFROW_PATH,
45     DUALFW_CONFROW_MAX,
46 };
47 
48 struct DualfwRowTypeInfo {
49     SettingItemType item;
50     DualfwConfRowType rowType;
51     int32_t settingType;
52     int32_t toneType;
53 };
54 
55 static const std::unordered_map<std::string, DualfwRowTypeInfo> g_dualfwInfoMap = {
56     {"notification_sound",      {SETTING_ITEM_NOTIFICATION, DUALFW_CONFROW_BASE, TONE_SETTING_TYPE_NOTIFICATION,
57         NOTIFICATION_TONE_TYPE}},
58     {"notification_sound_set",  {SETTING_ITEM_NOTIFICATION, DUALFW_CONFROW_SET,  TONE_SETTING_TYPE_NOTIFICATION,
59         NOTIFICATION_TONE_TYPE}},
60     {"notification_sound_path", {SETTING_ITEM_NOTIFICATION, DUALFW_CONFROW_PATH, TONE_SETTING_TYPE_NOTIFICATION,
61         NOTIFICATION_TONE_TYPE}},
62     {"alarm_alert",             {SETTING_ITEM_ALARM, DUALFW_CONFROW_BASE, TONE_SETTING_TYPE_ALARM, ALARM_TONE_TYPE}},
63     {"alarm_alert_set",         {SETTING_ITEM_ALARM, DUALFW_CONFROW_SET,  TONE_SETTING_TYPE_ALARM, ALARM_TONE_TYPE}},
64     {"alarm_alert_path",        {SETTING_ITEM_ALARM, DUALFW_CONFROW_PATH, TONE_SETTING_TYPE_ALARM, ALARM_TONE_TYPE}},
65     {"ringtone",                {SETTING_ITEM_RINGTONE, DUALFW_CONFROW_BASE, TONE_SETTING_TYPE_RINGTONE,
66         RING_TONE_TYPE_SIM_CARD_1}},
67     {"ringtone_set",            {SETTING_ITEM_RINGTONE, DUALFW_CONFROW_SET,  TONE_SETTING_TYPE_RINGTONE,
68         RING_TONE_TYPE_SIM_CARD_1}},
69     {"ringtone_path",           {SETTING_ITEM_RINGTONE, DUALFW_CONFROW_PATH, TONE_SETTING_TYPE_RINGTONE,
70         RING_TONE_TYPE_SIM_CARD_1}},
71     {"ringtone2",               {SETTING_ITEM_RINGTONE2, DUALFW_CONFROW_BASE, TONE_SETTING_TYPE_RINGTONE,
72         RING_TONE_TYPE_SIM_CARD_2}},
73     {"ringtone2_set",           {SETTING_ITEM_RINGTONE2, DUALFW_CONFROW_SET,  TONE_SETTING_TYPE_RINGTONE,
74         RING_TONE_TYPE_SIM_CARD_2}},
75     {"ringtone2_path",          {SETTING_ITEM_RINGTONE2, DUALFW_CONFROW_PATH, TONE_SETTING_TYPE_RINGTONE,
76         RING_TONE_TYPE_SIM_CARD_2}},
77     {"message",                 {SETTING_ITEM_MESSAGE, DUALFW_CONFROW_BASE, TONE_SETTING_TYPE_SHOT,
78         SHOT_TONE_TYPE_SIM_CARD_1}},
79     {"message_path",            {SETTING_ITEM_MESSAGE, DUALFW_CONFROW_PATH, TONE_SETTING_TYPE_SHOT,
80         SHOT_TONE_TYPE_SIM_CARD_1}},
81     {"messageSub1",             {SETTING_ITEM_MESSAGE2, DUALFW_CONFROW_BASE, TONE_SETTING_TYPE_SHOT,
82         SHOT_TONE_TYPE_SIM_CARD_2}},
83     {"messageSub1_path",        {SETTING_ITEM_MESSAGE2, DUALFW_CONFROW_PATH, TONE_SETTING_TYPE_SHOT,
84         SHOT_TONE_TYPE_SIM_CARD_2}},
85 };
86 
DualfwSoundSetting()87 DualfwSoundSetting::DualfwSoundSetting()
88 {}
89 
SettingsTraval(std::function<void (DualfwSettingItem &)> func)90 void DualfwSoundSetting::SettingsTraval(std::function<void (DualfwSettingItem &)> func)
91 {
92     for (auto setting : settings_) {
93         func(setting.second);
94     }
95 }
96 
ProcessConfRow(std::unique_ptr<DualFwConfRow> & conf)97 int32_t DualfwSoundSetting::ProcessConfRow(std::unique_ptr<DualFwConfRow> &conf)
98 {
99     int32_t ret = E_SUCCESS;
100 
101     auto found = g_dualfwInfoMap.find(conf->name);
102     if (found != g_dualfwInfoMap.end()) {
103         if (found->second.rowType == DUALFW_CONFROW_BASE) {
104             settings_[found->second.item].settingType = found->second.settingType;
105             settings_[found->second.item].toneType = found->second.toneType;
106             settings_[found->second.item].defaultSysSet = (conf->defaultSysSet == "true" ? true : false);
107         } else if (found->second.rowType == DUALFW_CONFROW_SET) {
108             try {
109                 settings_[found->second.item].setFlag = (std::stoi(conf->value) > 0 ? true : false);
110             } catch (const std::invalid_argument& e) {
111                 settings_[found->second.item].setFlag = false;
112                 RINGTONE_INFO_LOG("invalid argument: %s", e.what());
113             } catch (const std::out_of_range& e) {
114                 settings_[found->second.item].setFlag = false;
115                 RINGTONE_INFO_LOG("out of range: %s", e.what());
116             }
117         } else if (found->second.rowType == DUALFW_CONFROW_PATH) {
118             settings_[found->second.item].toneFileName = RingtoneFileUtils::GetFileNameFromPath(conf->value);
119         } else {
120             ret = E_ERR;
121         }
122     } else {
123         ret = E_ERR;
124     }
125 
126     return ret;
127 }
128 } // namespace Media
129 } // namespace OHOS
130