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(string & name)48 string RingtoneDefaultSetting::GetTonePathByDisplayName(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     string tonePath = {};
85     string strVal1 = {paramValue1};
86     tonePath = GetTonePathByDisplayName(strVal1);
87     if (!tonePath.empty() && tonePath != "") {
88         settingMgr_->CommitSetting(TONE_ID_DEFAULT, tonePath, TONE_SETTING_TYPE_SHOT, SHOT_TONE_TYPE_SIM_CARD_1,
89             SOURCE_TYPE_PRESET);
90     }
91 
92     string strVal2 = {paramValue2};
93     tonePath = GetTonePathByDisplayName(strVal2);
94     if (!tonePath.empty() && tonePath != "") {
95         settingMgr_->CommitSetting(TONE_ID_DEFAULT, tonePath, TONE_SETTING_TYPE_SHOT, SHOT_TONE_TYPE_SIM_CARD_2,
96             SOURCE_TYPE_PRESET);
97     }
98 }
99 
NotificationToneDefaultSettings()100 void RingtoneDefaultSetting::NotificationToneDefaultSettings()
101 {
102     char paramValue[SYSPARA_SIZE] = {0};
103     GetParameter(PARAM_RINGTONE_SETTING_NOTIFICATIONTONE, "", paramValue, SYSPARA_SIZE);
104 
105     string tonePath = {};
106     string strVal = {paramValue};
107     tonePath = GetTonePathByDisplayName(strVal);
108     if (!tonePath.empty() && tonePath != "") {
109         settingMgr_->CommitSetting(TONE_ID_DEFAULT, tonePath, TONE_SETTING_TYPE_NOTIFICATION,
110             NOTIFICATION_TONE_TYPE, SOURCE_TYPE_PRESET);
111     }
112 }
113 
RingToneDefaultSettings()114 void RingtoneDefaultSetting::RingToneDefaultSettings()
115 {
116     char paramValue1[SYSPARA_SIZE] = {0};
117     char paramValue2[SYSPARA_SIZE] = {0};
118 
119     GetParameter(PARAM_RINGTONE_SETTING_RINGTONE, "", paramValue1, SYSPARA_SIZE);
120     GetParameter(PARAM_RINGTONE_SETTING_RINGTONE2, "", paramValue2, SYSPARA_SIZE);
121 
122     string tonePath = {};
123     string strVal1 = {paramValue1};
124     tonePath = GetTonePathByDisplayName(strVal1);
125     if (!tonePath.empty() && tonePath != "") {
126         settingMgr_->CommitSetting(TONE_ID_DEFAULT, tonePath, TONE_SETTING_TYPE_RINGTONE, RING_TONE_TYPE_SIM_CARD_1,
127             SOURCE_TYPE_PRESET);
128     }
129 
130     string strVal2 = {paramValue2};
131     tonePath = GetTonePathByDisplayName(strVal2);
132     if (!tonePath.empty() && tonePath != "") {
133         settingMgr_->CommitSetting(TONE_ID_DEFAULT, tonePath, TONE_SETTING_TYPE_RINGTONE, RING_TONE_TYPE_SIM_CARD_2,
134             SOURCE_TYPE_PRESET);
135     }
136 }
137 
AlarmToneDefaultSettings()138 void RingtoneDefaultSetting::AlarmToneDefaultSettings()
139 {
140     char paramValue[SYSPARA_SIZE] = {0};
141     GetParameter(PARAM_RINGTONE_SETTING_ALARM, "", paramValue, SYSPARA_SIZE);
142 
143     string tonePath = {};
144     string strVal = {paramValue};
145     tonePath = GetTonePathByDisplayName(strVal);
146     if (!tonePath.empty()) {
147         settingMgr_->CommitSetting(TONE_ID_DEFAULT, tonePath, TONE_SETTING_TYPE_ALARM, ALARM_TONE_TYPE,
148             SOURCE_TYPE_PRESET);
149     }
150 }
151 
Update()152 void RingtoneDefaultSetting::Update()
153 {
154     ShotToneDefaultSettings();
155     NotificationToneDefaultSettings();
156     RingToneDefaultSettings();
157     AlarmToneDefaultSettings();
158 
159     if (settingMgr_ != nullptr) {
160         settingMgr_->FlushSettings();
161     } else {
162         RINGTONE_ERR_LOG("ringtone setting mgr is nullptr");
163     }
164     UpdateDefaultSystemTone();
165 }
166 
UpdateDefaultSystemTone()167 void RingtoneDefaultSetting::UpdateDefaultSystemTone()
168 {
169     RINGTONE_INFO_LOG("setting system tone begin");
170     auto infos = RingtoneUtils::GetDefaultSystemtoneInfo();
171     for (auto info : infos) {
172         const string querySql = "SELECT tone_id FROM ToneFiles WHERE display_name = "s + "\"" + info.second + "\"";
173         int32_t tone_id = 0;
174         settingMgr_->TravelQueryResultSet(querySql, [&](shared_ptr<RingtoneMetadata> &meta) -> bool {
175             tone_id = meta->GetToneId();
176             return true;
177         });
178 
179         NativeRdb::ValuesBucket values;
180         values.PutString(PRELOAD_CONFIG_COLUMN_DISPLAY_NAME, info.second);
181         values.PutInt(PRELOAD_CONFIG_COLUMN_TONE_ID, tone_id);
182         NativeRdb::AbsRdbPredicates absRdbPredicates(PRELOAD_CONFIG_TABLE);
183         absRdbPredicates.EqualTo(PRELOAD_CONFIG_COLUMN_RING_TONE_TYPE, std::to_string(info.first));
184         int32_t changedRows = 0;
185         int32_t result = settingMgr_->Update(changedRows, values, absRdbPredicates);
186         if (result != E_OK || changedRows <= 0) {
187             RINGTONE_ERR_LOG("Update operation failed. Result %{public}d. Updated %{public}d", result, changedRows);
188         }
189     }
190 }
191 
192 } // namespace Media
193 } // namespace OHOS
194