• 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 #define MLOG_TAG "RingtoneRestoreBase"
17 
18 #include "ringtone_restore_base.h"
19 
20 #include "datashare_ext_ability.h"
21 #include "datashare_ext_ability_context.h"
22 #include "rdb_helper.h"
23 #include "rdb_sql_utils.h"
24 #include "result_set.h"
25 #include "result_set_utils.h"
26 #include "ringtone_restore_type.h"
27 #include "ringtone_restore_db_utils.h"
28 #include "ringtone_db_const.h"
29 #include "ringtone_errno.h"
30 #include "ringtone_file_utils.h"
31 #include "ringtone_utils.h"
32 #include "ringtone_log.h"
33 #include "ringtone_mimetype_utils.h"
34 #include "ringtone_rdb_transaction.h"
35 #include "ringtone_rdbstore.h"
36 #include "ringtone_scanner_manager.h"
37 #include "preferences_helper.h"
38 #include "dfx_const.h"
39 
40 namespace OHOS {
41 namespace Media {
42 using namespace std;
43 
44 static const char RINGTONE_PARAMETER_SCANNER_COMPLETED_KEY[] = "ringtone.scanner.completed";
45 static const int RINGTONE_PARAMETER_SCANNER_COMPLETED_TRUE = 1;
46 static const int RINGTONE_PARAMETER_SCANNER_COMPLETED_FALSE = 0;
47 
Init(const string & backupPath)48 int32_t RingtoneRestoreBase::Init(const string &backupPath)
49 {
50     if (localRdb_ != nullptr) {
51         return E_OK;
52     }
53     auto context = AbilityRuntime::Context::GetApplicationContext();
54     if (context == nullptr) {
55         RINGTONE_ERR_LOG("Failed to get context");
56         return E_FAIL;
57     }
58 
59     auto rdbStore = RingtoneRdbStore::GetInstance(context);
60     if (rdbStore == nullptr) {
61         RINGTONE_ERR_LOG("rdbStore initialization failed");
62         return E_RDB;
63     }
64 
65     int32_t errCode = 0;
66     string realPath = NativeRdb::RdbSqlUtils::GetDefaultDatabasePath(RINGTONE_LIBRARY_DB_PATH_EL1,
67         RINGTONE_LIBRARY_DB_NAME, errCode);
68     int32_t err = RingtoneRestoreDbUtils::InitDb(localRdb_, RINGTONE_LIBRARY_DB_PATH_EL1, realPath,
69         RINGTONE_BUNDLE_NAME, true);
70     if (err != E_OK) {
71         RINGTONE_ERR_LOG("medialibrary rdb fail, err = %{public}d", err);
72         return E_FAIL;
73     }
74     settingMgr_ = make_unique<RingtoneSettingManager>(localRdb_);
75     if (settingMgr_ == nullptr) {
76         RINGTONE_ERR_LOG("create ringtone setting manager failed");
77         return E_FAIL;
78     }
79 
80     return E_OK;
81 }
82 
StartRestore()83 int32_t RingtoneRestoreBase::StartRestore()
84 {
85     RingtoneFileUtils::AccessRingtoneDir();
86     int32_t errCode = RingtoneMimeTypeUtils::InitMimeTypeMap();
87     if (errCode != E_OK) {
88         RINGTONE_ERR_LOG("get mine type map error: %{public}d", errCode);
89         return errCode;
90     }
91     shared_ptr<NativePreferences::Preferences> prefs =
92         NativePreferences::PreferencesHelper::GetPreferences(COMMON_XML_EL1, errCode);
93     if (!prefs) {
94         RINGTONE_ERR_LOG("get preferences error: %{public}d", errCode);
95         return E_FAIL;
96     }
97     int isCompleted = prefs->GetInt(RINGTONE_PARAMETER_SCANNER_COMPLETED_KEY,
98         RINGTONE_PARAMETER_SCANNER_COMPLETED_FALSE);
99     if (!isCompleted) {
100         RingtoneScannerManager::GetInstance()->Start(true);
101         prefs->PutInt(RINGTONE_PARAMETER_SCANNER_COMPLETED_KEY, RINGTONE_PARAMETER_SCANNER_COMPLETED_TRUE);
102         prefs->FlushSync();
103     }
104     return E_OK;
105 }
106 
MoveFile(const std::string & src,const std::string & dst)107 bool RingtoneRestoreBase::MoveFile(const std::string &src, const std::string &dst)
108 {
109     if (RingtoneFileUtils::MoveFile(src, dst)) {
110         return true;
111     }
112 
113     if (!RingtoneFileUtils::CopyFileUtil(src, dst)) {
114         RINGTONE_ERR_LOG("copy-file failed, src: %{public}s, err: %{public}s", src.c_str(), strerror(errno));
115         return false;
116     }
117 
118     if (!RingtoneFileUtils::DeleteFile(src)) {
119         RINGTONE_ERR_LOG("remove-file failed, filePath: %{public}s, err: %{public}s", src.c_str(), strerror(errno));
120     }
121 
122     return true;
123 }
124 
NeedCommitSetting(const std::string & typeColumn,const std::string & sourceColumn,int type,int allSetType)125 bool RingtoneRestoreBase::NeedCommitSetting(const std::string &typeColumn, const std::string &sourceColumn,
126     int type, int allSetType)
127 {
128     auto type2Str = std::to_string(type);
129     auto allSetTypeStr = std::to_string(allSetType);
130     // allSetType is for those settings with both sim cards
131     string queryCountSql = "SELECT count(1) as count FROM " + RINGTONE_TABLE + " WHERE " +  sourceColumn +
132         " = 2 AND (" + typeColumn + " = " + type2Str + " OR " + typeColumn + " = " + allSetTypeStr + " );";
133     RINGTONE_INFO_LOG("queryCountSql: %{public}s", queryCountSql.c_str());
134 
135     int32_t count = RingtoneRestoreDbUtils::QueryInt(localRdb_, queryCountSql, "count");
136     RINGTONE_INFO_LOG("got count = %{public}d", count);
137     if (count > 0) {
138         return false;
139     }
140     return !DetermineNoRingtone(typeColumn, sourceColumn, type, allSetType, localRdb_);
141 }
142 
DetermineNoRingtone(const std::string & typeColumn,const std::string & sourceColumn,int type,int allSetType,const std::shared_ptr<NativeRdb::RdbStore> & rdbStore)143 bool RingtoneRestoreBase::DetermineNoRingtone(const std::string &typeColumn,
144     const std::string &sourceColumn, int type, int allSetType, const std::shared_ptr<NativeRdb::RdbStore> &rdbStore)
145 {
146     string queryCountSql = "SELECT count(1) as count FROM " + RINGTONE_TABLE + " WHERE " + sourceColumn +
147         " > 0 AND ( " + typeColumn + " = " + to_string(type) + " OR " + typeColumn + " = " +
148         to_string(allSetType) + " );";
149     RINGTONE_INFO_LOG("queryCountSql: %{public}s", queryCountSql.c_str());
150     int32_t count = RingtoneRestoreDbUtils::QueryInt(rdbStore, queryCountSql, "count");
151     RINGTONE_INFO_LOG("got no ringtone count = %{public}d", count);
152     if (count == 0) {
153         RINGTONE_INFO_LOG("no ringtone sound");
154         return true;
155     }
156     return false;
157 }
158 
CheckShotSetting(FileInfo & info)159 void RingtoneRestoreBase::CheckShotSetting(FileInfo &info)
160 {
161     if (info.shotToneType == SHOT_TONE_TYPE_SIM_CARD_BOTH && info.shotToneSourceType == SOURCE_TYPE_CUSTOMISED) {
162         if (NeedCommitSetting(RINGTONE_COLUMN_SHOT_TONE_TYPE, RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE,
163             SHOT_TONE_TYPE_SIM_CARD_1, SHOT_TONE_TYPE_SIM_CARD_BOTH)) {
164             settingMgr_->CommitSetting(info.toneId, info.restorePath, TONE_SETTING_TYPE_SHOT,
165                 SHOT_TONE_TYPE_SIM_CARD_1, info.shotToneSourceType);
166             RINGTONE_INFO_LOG("commit as card1 shottone");
167         }
168         if (NeedCommitSetting(RINGTONE_COLUMN_SHOT_TONE_TYPE, RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE,
169             SHOT_TONE_TYPE_SIM_CARD_2, SHOT_TONE_TYPE_SIM_CARD_BOTH)) {
170             settingMgr_->CommitSetting(info.toneId, info.restorePath, TONE_SETTING_TYPE_SHOT,
171                 SHOT_TONE_TYPE_SIM_CARD_2, info.shotToneSourceType);
172             RINGTONE_INFO_LOG("commit as card2 shottone");
173         }
174     } else if ((info.shotToneType > SHOT_TONE_TYPE_NOT) && (info.shotToneType < SHOT_TONE_TYPE_SIM_CARD_BOTH) &&
175             (info.shotToneSourceType == SOURCE_TYPE_CUSTOMISED) && NeedCommitSetting(RINGTONE_COLUMN_SHOT_TONE_TYPE,
176             RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE, info.shotToneType, SHOT_TONE_TYPE_SIM_CARD_BOTH)) {
177         settingMgr_->CommitSetting(info.toneId, info.restorePath, TONE_SETTING_TYPE_SHOT, info.shotToneType,
178             info.shotToneSourceType);
179         RINGTONE_INFO_LOG("commit as shottone");
180     }
181 }
182 
CheckRingtoneSetting(FileInfo & info)183 void RingtoneRestoreBase::CheckRingtoneSetting(FileInfo &info)
184 {
185     if (info.ringToneType == RING_TONE_TYPE_SIM_CARD_BOTH && info.ringToneSourceType == SOURCE_TYPE_CUSTOMISED) {
186         if (NeedCommitSetting(RINGTONE_COLUMN_RING_TONE_TYPE, RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE,
187             RING_TONE_TYPE_SIM_CARD_1, RING_TONE_TYPE_SIM_CARD_BOTH)) {
188             settingMgr_->CommitSetting(info.toneId, info.restorePath, TONE_SETTING_TYPE_RINGTONE,
189                 RING_TONE_TYPE_SIM_CARD_1, info.ringToneSourceType);
190             RINGTONE_INFO_LOG("commit as card1 ringtone");
191         }
192         if (NeedCommitSetting(RINGTONE_COLUMN_RING_TONE_TYPE, RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE,
193             RING_TONE_TYPE_SIM_CARD_2, RING_TONE_TYPE_SIM_CARD_BOTH)) {
194             settingMgr_->CommitSetting(info.toneId, info.restorePath, TONE_SETTING_TYPE_RINGTONE,
195                 RING_TONE_TYPE_SIM_CARD_2, info.ringToneSourceType);
196             RINGTONE_INFO_LOG("commit as card2 ringtone");
197         }
198     } else if (info.ringToneType > RING_TONE_TYPE_NOT && info.ringToneType < RING_TONE_TYPE_SIM_CARD_BOTH &&
199             info.ringToneSourceType == SOURCE_TYPE_CUSTOMISED && NeedCommitSetting(RINGTONE_COLUMN_RING_TONE_TYPE,
200             RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE, info.ringToneType, RING_TONE_TYPE_SIM_CARD_BOTH)) {
201         settingMgr_->CommitSetting(info.toneId, info.restorePath, TONE_SETTING_TYPE_RINGTONE, info.ringToneType,
202             info.ringToneSourceType);
203         RINGTONE_INFO_LOG("commit as ringtone");
204     }
205 }
206 
CheckSetting(FileInfo & info)207 void RingtoneRestoreBase::CheckSetting(FileInfo &info)
208 {
209     RINGTONE_INFO_LOG("checking setting: %{public}s", info.toString().c_str());
210     CheckShotSetting(info);
211     CheckRingtoneSetting(info);
212 
213     if (info.notificationToneType == NOTIFICATION_TONE_TYPE &&
214             info.notificationToneSourceType == SOURCE_TYPE_CUSTOMISED &&
215             NeedCommitSetting(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE,
216             RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE, info.notificationToneType, NOTIFICATION_TONE_TYPE)) {
217         settingMgr_->CommitSetting(info.toneId, info.restorePath, TONE_SETTING_TYPE_NOTIFICATION,
218             info.notificationToneType, info.notificationToneSourceType);
219         RINGTONE_INFO_LOG("commit as notificationTone");
220     }
221     if (info.alarmToneType == ALARM_TONE_TYPE && info.alarmToneSourceType == SOURCE_TYPE_CUSTOMISED &&
222             NeedCommitSetting(RINGTONE_COLUMN_ALARM_TONE_TYPE, RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE,
223             info.alarmToneType, ALARM_TONE_TYPE)) {
224         settingMgr_->CommitSetting(info.toneId, info.restorePath, TONE_SETTING_TYPE_ALARM, info.alarmToneType,
225             info.alarmToneSourceType);
226         RINGTONE_INFO_LOG("commit as alarmTone");
227     }
228 }
229 
InsertTones(std::vector<FileInfo> & fileInfos)230 int32_t RingtoneRestoreBase::InsertTones(std::vector<FileInfo> &fileInfos)
231 {
232     if (localRdb_ == nullptr) {
233         RINGTONE_ERR_LOG("localRdb_ is null");
234         return E_FAIL;
235     }
236     if (fileInfos.empty()) {
237         RINGTONE_ERR_LOG("fileInfos are empty, not need restore");
238         return E_OK;
239     }
240     vector<NativeRdb::ValuesBucket> values = MakeInsertValues(fileInfos);
241     int64_t rowNum = 0;
242     int32_t errCode = BatchInsert(RINGTONE_TABLE, values, rowNum);
243     if (errCode != E_OK) {
244         RINGTONE_ERR_LOG("fail to batch insert");
245         return errCode;
246     }
247 
248     OnFinished(fileInfos);
249     return E_OK;
250 }
251 
FlushSettings()252 void RingtoneRestoreBase::FlushSettings()
253 {
254     if (settingMgr_ != nullptr) {
255         settingMgr_->FlushSettings();
256     } else {
257         RINGTONE_ERR_LOG("ringtone setting mgr is nullptr");
258     }
259 }
260 
BatchInsert(const std::string & tableName,std::vector<NativeRdb::ValuesBucket> & values,int64_t & rowNum)261 int32_t RingtoneRestoreBase::BatchInsert(const std::string &tableName, std::vector<NativeRdb::ValuesBucket> &values,
262     int64_t &rowNum)
263 {
264     int32_t errCode = E_ERR;
265     RingtoneRdbTransaction transactionOprn(localRdb_);
266     errCode = transactionOprn.Start();
267     if (errCode != E_OK) {
268         RINGTONE_ERR_LOG("can not get rdb before batch insert");
269         return errCode;
270     }
271     errCode = localRdb_->BatchInsert(rowNum, tableName, values);
272     if (errCode != E_OK) {
273         RINGTONE_ERR_LOG("InsertSql failed, errCode: %{public}d, rowNum: %{public}ld.", errCode, (long)rowNum);
274         return errCode;
275     }
276     transactionOprn.Finish();
277     return errCode;
278 }
279 
GetRestoreDir(const int32_t toneType)280 string RingtoneRestoreBase::GetRestoreDir(const int32_t toneType)
281 {
282     string path = {};
283     if (toneType == ToneType::TONE_TYPE_ALARM) {
284         path = RINGTONE_CUSTOMIZED_ALARM_PATH;
285     } else if (toneType == TONE_TYPE_RINGTONE) {
286         path = RINGTONE_CUSTOMIZED_RINGTONE_PATH;
287     } else if (toneType == TONE_TYPE_NOTIFICATION) {
288         path = RINGTONE_CUSTOMIZED_NOTIFICATIONS_PATH;
289     } else {
290         path = {};
291     }
292 
293     // check ringtone dir
294     if (!path.empty() && access(path.c_str(), F_OK) != 0) {
295         if (!RingtoneFileUtils::CreateDirectory(path)) {
296             RINGTONE_ERR_LOG("Create customised tone dir: %{private}s failed!", path.c_str());
297         }
298     }
299     return path;
300 }
301 
MakeInsertValues(std::vector<FileInfo> & fileInfos)302 vector<NativeRdb::ValuesBucket> RingtoneRestoreBase::MakeInsertValues(std::vector<FileInfo> &fileInfos)
303 {
304     vector<NativeRdb::ValuesBucket> values;
305     for (auto it = fileInfos.begin(); it != fileInfos.end(); it++) {
306         auto destDir = GetRestoreDir(it->toneType);
307         if (destDir.empty() || !OnPrepare(*it, destDir)) {
308             continue;
309         }
310 
311         NativeRdb::ValuesBucket value = SetInsertValue(*it);
312         if (value.IsEmpty()) {
313             continue;
314         }
315         if (it->doInsert) { // only when this value needs to be inserted
316             values.emplace_back(value);
317         }
318         CheckSetting(*it);
319     }
320     return values;
321 }
322 
SetInsertValue(const FileInfo & fileInfo)323 NativeRdb::ValuesBucket RingtoneRestoreBase::SetInsertValue(const FileInfo &fileInfo)
324 {
325     if (fileInfo.restorePath.empty() || fileInfo.data.empty()) {
326         return {};
327     }
328     NativeRdb::ValuesBucket values;
329     values.PutString(RINGTONE_COLUMN_DATA, fileInfo.restorePath);
330     values.PutInt(RINGTONE_COLUMN_SIZE, fileInfo.size);
331     values.PutString(RINGTONE_COLUMN_DISPLAY_NAME, fileInfo.displayName);
332     values.PutString(RINGTONE_COLUMN_TITLE, fileInfo.title);
333     values.PutInt(RINGTONE_COLUMN_MEDIA_TYPE, fileInfo.mediaType);
334     values.PutInt(RINGTONE_COLUMN_TONE_TYPE, fileInfo.toneType);
335     values.PutString(RINGTONE_COLUMN_MIME_TYPE, fileInfo.mimeType);
336     values.PutInt(RINGTONE_COLUMN_SOURCE_TYPE, fileInfo.sourceType);
337     values.PutLong(RINGTONE_COLUMN_DATE_ADDED, fileInfo.dateAdded);
338     values.PutLong(RINGTONE_COLUMN_DATE_MODIFIED, fileInfo.dateModified);
339     values.PutLong(RINGTONE_COLUMN_DATE_TAKEN, fileInfo.dateTaken);
340     values.PutInt(RINGTONE_COLUMN_DURATION, fileInfo.duration);
341     values.PutInt(RINGTONE_COLUMN_SCANNER_FLAG, fileInfo.scannerFlag);
342     // ringtone setting infos
343     values.PutInt(RINGTONE_COLUMN_SHOT_TONE_TYPE, SHOT_TONE_TYPE_DEFAULT);
344     values.PutInt(RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE, SHOT_TONE_SOURCE_TYPE_DEFAULT);
345     values.PutInt(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE, NOTIFICATION_TONE_TYPE_DEFAULT);
346     values.PutInt(RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE, NOTIFICATION_TONE_SOURCE_TYPE_DEFAULT);
347     values.PutInt(RINGTONE_COLUMN_RING_TONE_TYPE, RING_TONE_TYPE_DEFAULT);
348     values.PutInt(RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE, RING_TONE_SOURCE_TYPE_DEFAULT);
349     values.PutInt(RINGTONE_COLUMN_ALARM_TONE_TYPE, ALARM_TONE_TYPE_DEFAULT);
350     values.PutInt(RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE, ALARM_TONE_SOURCE_TYPE_DEFAULT);
351 
352     return values;
353 }
354 
MoveDirectory(const std::string & srcDir,const std::string & dstDir)355 int32_t RingtoneRestoreBase::MoveDirectory(const std::string &srcDir, const std::string &dstDir)
356 {
357     if (!RingtoneFileUtils::CreateDirectory(dstDir)) {
358         RINGTONE_ERR_LOG("Create dstDir %{private}s failed", dstDir.c_str());
359         return E_FAIL;
360     }
361     for (const auto &dirEntry : std::filesystem::directory_iterator{ srcDir }) {
362         std::string srcFilePath = dirEntry.path();
363         std::string tmpFilePath = srcFilePath;
364         std::string dstFilePath = tmpFilePath.replace(0, srcDir.length(), dstDir);
365         if (!MoveFile(srcFilePath, dstFilePath)) {
366             RINGTONE_ERR_LOG("Move file from %{private}s to %{private}s failed", srcFilePath.c_str(),
367                 dstFilePath.c_str());
368             return E_FAIL;
369         }
370     }
371     return E_OK;
372 }
373 
ExtractMetaFromColumn(const shared_ptr<NativeRdb::ResultSet> & resultSet,unique_ptr<RingtoneMetadata> & metadata,const std::string & col)374 void RingtoneRestoreBase::ExtractMetaFromColumn(const shared_ptr<NativeRdb::ResultSet> &resultSet,
375     unique_ptr<RingtoneMetadata> &metadata, const std::string &col)
376 {
377     RingtoneResultSetDataType dataType = RingtoneResultSetDataType::DATA_TYPE_NULL;
378     RingtoneMetadata::RingtoneMetadataFnPtr requestFunc = nullptr;
379     auto itr = metadata->memberFuncMap_.find(col);
380     if (itr != metadata->memberFuncMap_.end()) {
381         dataType = itr->second.first;
382         requestFunc = itr->second.second;
383     } else {
384         RINGTONE_ERR_LOG("column name invalid %{private}s", col.c_str());
385         return;
386     }
387 
388     std::variant<int32_t, std::string, int64_t, double> data =
389         ResultSetUtils::GetValFromColumn<const shared_ptr<NativeRdb::ResultSet>>(col, resultSet, dataType);
390 
391     if (requestFunc != nullptr) {
392         (metadata.get()->*requestFunc)(data);
393     }
394 }
395 
PopulateMetadata(const shared_ptr<NativeRdb::ResultSet> & resultSet,unique_ptr<RingtoneMetadata> & metaData)396 int32_t RingtoneRestoreBase::PopulateMetadata(const shared_ptr<NativeRdb::ResultSet> &resultSet,
397     unique_ptr<RingtoneMetadata> &metaData)
398 {
399     std::vector<std::string> columnNames;
400     int32_t err = resultSet->GetAllColumnNames(columnNames);
401     if (err != NativeRdb::E_OK) {
402         RINGTONE_ERR_LOG("failed to get all column names");
403         return E_RDB;
404     }
405 
406     for (const auto &col : columnNames) {
407         ExtractMetaFromColumn(resultSet, metaData, col);
408     }
409 
410     return E_OK;
411 }
412 
SetNotRingtone(const string & columnType,const string & columnSourceType,int32_t simCard)413 void RingtoneRestoreBase::SetNotRingtone(const string &columnType, const string &columnSourceType, int32_t simCard)
414 {
415     CHECK_AND_RETURN_LOG(localRdb_ != nullptr, "localRdb_ is null, can not set not ringtone");
416     int32_t changeRows = 0;
417     NativeRdb::ValuesBucket valuesBucket;
418     valuesBucket.PutInt(columnType, RING_TONE_TYPE_NOT);
419     valuesBucket.PutInt(columnSourceType, SOURCE_TYPE_NOT_SET);
420     NativeRdb::AbsRdbPredicates absRdbPredicates(RINGTONE_TABLE);
421     string whereClause = columnType + "= ? AND " + columnSourceType + " = 1";
422     vector<string> whereArgs;
423     whereArgs.push_back(to_string(simCard));
424     absRdbPredicates.SetWhereClause(whereClause);
425     absRdbPredicates.SetWhereArgs(whereArgs);
426     localRdb_->Update(changeRows, valuesBucket, absRdbPredicates);
427     RINGTONE_INFO_LOG("update end changeRows = %{public}d", changeRows);
428 
429     CHECK_AND_RETURN_LOG(columnType != RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE, "set ok for notification tone");
430     if (simCard == SIM_CARD_1) {
431         simCard = SIM_CARD_2;
432     } else {
433         simCard = SIM_CARD_1;
434     }
435     changeRows = 0;
436     NativeRdb::ValuesBucket valuesBucketBoth;
437     valuesBucketBoth.PutInt(columnType, simCard);
438     valuesBucketBoth.PutInt(columnSourceType, SOURCE_TYPE_PRESET);
439     NativeRdb::AbsRdbPredicates absRdbPredicatesBoth(RINGTONE_TABLE);
440     string whereClauseBoth = columnType + "= ? AND " + columnSourceType + " = 1";
441     vector<string> whereArgsBoth;
442     whereArgsBoth.push_back(to_string(SIM_CARD_BOTH));
443     absRdbPredicatesBoth.SetWhereClause(whereClauseBoth);
444     absRdbPredicatesBoth.SetWhereArgs(whereArgsBoth);
445     localRdb_->Update(changeRows, valuesBucketBoth, absRdbPredicatesBoth);
446     RINGTONE_INFO_LOG("update both end changeRows = %{public}d", changeRows);
447 }
448 } // namespace Media
449 } // namespace OHOS
450