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