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 #define MLOG_TAG "RingtoneDefaultSetting"
16
17 #include "ringtone_default_setting.h"
18
19 #include "parameter.h"
20 #include "rdb_errno.h"
21 #include "ringtone_errno.h"
22 #include "ringtone_log.h"
23 #include "ringtone_type.h"
24 #include "ringtone_scanner_db.h"
25 #include "ringtone_setting_manager.h"
26 #include "rdb_helper.h"
27 #include "result_set.h"
28 #include "ringtone_utils.h"
29
30 namespace OHOS {
31 namespace Media {
32 using namespace std;
33 static const int32_t SYSPARA_SIZE = 128;
GetObj(std::shared_ptr<NativeRdb::RdbStore> &rdb)34 std::unique_ptr<RingtoneDefaultSetting> RingtoneDefaultSetting::GetObj(std::shared_ptr<NativeRdb::RdbStore> &rdb)
35 {
36 return make_unique<RingtoneDefaultSetting>(rdb);
37 }
38
RingtoneDefaultSetting(shared_ptr<NativeRdb::RdbStore> &rdb)39 RingtoneDefaultSetting::RingtoneDefaultSetting(shared_ptr<NativeRdb::RdbStore> &rdb)
40 {
41 settingMgr_ = make_unique<RingtoneSettingManager>(rdb);
42 }
43
44 #ifndef OHOS_LOCAL_DEBUG_DISABLE
45 // liuxk just for debug
46 static const std::string LOCAL_DIR = "/data/storage/el2/base/preload_data";
47 #endif
GetTonePathByDisplayName(const string &name)48 string RingtoneDefaultSetting::GetTonePathByDisplayName(const string &name)
49 {
50 string pathStr = {};
51 string querySql = "SELECT data FROM ToneFiles WHERE display_name = "s + "\"" + name + "\"";
52 settingMgr_->TravelQueryResultSet(querySql, [&](shared_ptr<RingtoneMetadata> &meta) -> bool {
53 pathStr = meta->GetData();
54 if (pathStr.empty()) {
55 pathStr = {};
56 return false;
57 }
58 if (pathStr.find(ROOT_TONE_PRELOAD_PATH_NOAH_PATH) == 0 ||
59 pathStr.find(ROOT_TONE_PRELOAD_PATH_CHINA_PATH) == 0 ||
60 #ifndef OHOS_LOCAL_DEBUG_DISABLE
61 pathStr.find(LOCAL_DIR) == 0 ||
62 #endif
63 pathStr.find(ROOT_TONE_PRELOAD_PATH_OVERSEA_PATH) == 0) {
64 #ifndef OHOS_LOCAL_DEBUG_DISABLE
65 RINGTONE_ERR_LOG("liuxk, find path=%{public}s", pathStr.c_str());
66 #endif
67 return true;
68 }
69 pathStr = {};
70 return false;
71 });
72
73 return pathStr;
74 }
75
ShotToneDefaultSettings()76 void RingtoneDefaultSetting::ShotToneDefaultSettings()
77 {
78 char paramValue1[SYSPARA_SIZE] = {0};
79 char paramValue2[SYSPARA_SIZE] = {0};
80
81 GetParameter(PARAM_RINGTONE_SETTING_SHOT, "", paramValue1, SYSPARA_SIZE);
82 GetParameter(PARAM_RINGTONE_SETTING_SHOT2, "", paramValue2, SYSPARA_SIZE);
83
84 if (strcmp(paramValue1, "")) {
85 string tonePath = {};
86 string strVal = {paramValue1};
87 tonePath = GetTonePathByDisplayName(strVal);
88 if (!tonePath.empty()) {
89 settingMgr_->CommitSetting(TONE_ID_DEFAULT, tonePath, TONE_SETTING_TYPE_SHOT, SHOT_TONE_TYPE_SIM_CARD_1,
90 SOURCE_TYPE_PRESET);
91 }
92 }
93
94 if (strcmp(paramValue2, "")) {
95 string tonePath = {};
96 string strVal = {paramValue2};
97 tonePath = GetTonePathByDisplayName(strVal);
98 if (!tonePath.empty()) {
99 settingMgr_->CommitSetting(TONE_ID_DEFAULT, tonePath, TONE_SETTING_TYPE_SHOT, SHOT_TONE_TYPE_SIM_CARD_2,
100 SOURCE_TYPE_PRESET);
101 }
102 }
103 }
104
NotificationToneDefaultSettings()105 void RingtoneDefaultSetting::NotificationToneDefaultSettings()
106 {
107 char paramValue[SYSPARA_SIZE] = {0};
108 GetParameter(PARAM_RINGTONE_SETTING_NOTIFICATIONTONE, "", paramValue, SYSPARA_SIZE);
109
110 if (strcmp(paramValue, "")) {
111 string tonePath = {};
112 string strVal = {paramValue};
113 tonePath = GetTonePathByDisplayName(strVal);
114 if (!tonePath.empty()) {
115 settingMgr_->CommitSetting(TONE_ID_DEFAULT, tonePath, TONE_SETTING_TYPE_NOTIFICATION,
116 NOTIFICATION_TONE_TYPE, SOURCE_TYPE_PRESET);
117 }
118 }
119 }
120
RingToneDefaultSettings()121 void RingtoneDefaultSetting::RingToneDefaultSettings()
122 {
123 char paramValue1[SYSPARA_SIZE] = {0};
124 char paramValue2[SYSPARA_SIZE] = {0};
125
126 GetParameter(PARAM_RINGTONE_SETTING_RINGTONE, "", paramValue1, SYSPARA_SIZE);
127 GetParameter(PARAM_RINGTONE_SETTING_RINGTONE2, "", paramValue2, SYSPARA_SIZE);
128
129 if (strcmp(paramValue1, "")) {
130 string tonePath = {};
131 string strVal = {paramValue1};
132 tonePath = GetTonePathByDisplayName(strVal);
133 if (!tonePath.empty()) {
134 settingMgr_->CommitSetting(TONE_ID_DEFAULT, tonePath, TONE_SETTING_TYPE_RINGTONE, RING_TONE_TYPE_SIM_CARD_1,
135 SOURCE_TYPE_PRESET);
136 }
137 }
138
139 if (strcmp(paramValue2, "")) {
140 string tonePath = {};
141 string strVal = {paramValue2};
142 tonePath = GetTonePathByDisplayName(strVal);
143 if (!tonePath.empty()) {
144 settingMgr_->CommitSetting(TONE_ID_DEFAULT, tonePath, TONE_SETTING_TYPE_RINGTONE, RING_TONE_TYPE_SIM_CARD_2,
145 SOURCE_TYPE_PRESET);
146 }
147 }
148 }
149
AlarmToneDefaultSettings()150 void RingtoneDefaultSetting::AlarmToneDefaultSettings()
151 {
152 char paramValue[SYSPARA_SIZE] = {0};
153 GetParameter(PARAM_RINGTONE_SETTING_ALARM, "", paramValue, SYSPARA_SIZE);
154
155 if (strcmp(paramValue, "")) {
156 string tonePath = {};
157 string strVal = {paramValue};
158 tonePath = GetTonePathByDisplayName(strVal);
159 if (!tonePath.empty()) {
160 settingMgr_->CommitSetting(TONE_ID_DEFAULT, tonePath, TONE_SETTING_TYPE_ALARM, ALARM_TONE_TYPE,
161 SOURCE_TYPE_PRESET);
162 }
163 }
164 }
165
Update()166 void RingtoneDefaultSetting::Update()
167 {
168 ShotToneDefaultSettings();
169 NotificationToneDefaultSettings();
170 RingToneDefaultSettings();
171 AlarmToneDefaultSettings();
172
173 if (settingMgr_ != nullptr) {
174 settingMgr_->FlushSettings();
175 } else {
176 RINGTONE_ERR_LOG("ringtone setting mgr is nullptr");
177 }
178 UpdateDefaultSystemTone();
179 }
180
UpdateDefaultSystemTone()181 void RingtoneDefaultSetting::UpdateDefaultSystemTone()
182 {
183 RINGTONE_INFO_LOG("setting system tone begin");
184 auto infos = RingtoneUtils::GetDefaultSystemtoneInfo();
185 for (auto info : infos) {
186 const string querySql = "SELECT tone_id FROM ToneFiles WHERE display_name = "s + "\"" + info.second + "\"";
187 int32_t tone_id = 0;
188 settingMgr_->TravelQueryResultSet(querySql, [&](shared_ptr<RingtoneMetadata> &meta) -> bool {
189 tone_id = meta->GetToneId();
190 return true;
191 });
192
193 NativeRdb::ValuesBucket values;
194 values.PutString(PRELOAD_CONFIG_COLUMN_DISPLAY_NAME, info.second);
195 values.PutInt(PRELOAD_CONFIG_COLUMN_TONE_ID, tone_id);
196 NativeRdb::AbsRdbPredicates absRdbPredicates(PRELOAD_CONFIG_TABLE);
197 absRdbPredicates.EqualTo(PRELOAD_CONFIG_COLUMN_RING_TONE_TYPE, std::to_string(info.first));
198 int32_t changedRows = 0;
199 int32_t result = settingMgr_->Update(changedRows, values, absRdbPredicates);
200 if (result != E_OK || changedRows <= 0) {
201 RINGTONE_ERR_LOG("Update operation failed. Result %{public}d. Updated %{public}d", result, changedRows);
202 }
203 }
204 }
205
206 } // namespace Media
207 } // namespace OHOS
208