1/** 2 * Copyright (c) 2022 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 */ 15import commonEvent from "@ohos.commonEventManager"; 16import common from "../data/commonData"; 17import mmsTable from "../data/tableData"; 18import telephoneUtils from "../utils/TelephoneUtil"; 19import HiLog from "../utils/HiLog"; 20import particleAbility from "@ohos.ability.particleAbility"; 21import MmsDatabaseHelper from "../utils/MmsDatabaseHelper"; 22import ohosDataAbility from "@ohos.data.dataAbility"; 23import telSim from "@ohos.telephony.sms"; 24import ohosDataRdb from "@ohos.data.rdb"; 25import commonService from "../service/CommonService"; 26import http from "@ohos.net.http"; 27import NotificationService from "../service/NotificationService"; 28import LooseObject from "../data/LooseObject" 29import dataShare from "@ohos.data.dataShare"; 30import dataSharePredicates from "@ohos.data.dataSharePredicates"; 31import messageService from "../service/ConversationListService"; 32 33const TAG = 'MmsStaticSubscriber' 34// database instance object 35var rdbStore = undefined; 36 37var StaticSubscriberExtensionAbility = globalThis.requireNapi('application.StaticSubscriberExtensionAbility'); 38 39export default class MmsStaticSubscriber extends StaticSubscriberExtensionAbility { 40 onReceiveEvent(data) { 41 HiLog.i(TAG, 'onRecevieEvent, event:' ); 42 // Initializing the Database 43 this.initRdb(data) 44 45 } 46 47 async dealSmsReceiveData(data) { 48 let netType = data.parameters.isCdma ? "3gpp2" : "3gpp"; 49 // Synchronize wait operation 50 let promisesAll = []; 51 data.parameters.pdus.forEach(pdu => { 52 let promise = telSim.createMessage(this.convertStrArray(pdu), netType); 53 promisesAll.push(promise); 54 }); 55 56 let result: LooseObject = {}; 57 let createMessagePromise = Promise.all(promisesAll) 58 createMessagePromise.then((shortMsgList) => { 59 result.code = common.int.SUCCESS; 60 result.telephone = telephoneUtils.formatTelephone(shortMsgList[0].visibleRawAddress); 61 result.content = ''; 62 shortMsgList.forEach(shortMessage => { 63 result.content += shortMessage.visibleMessageBody; 64 }) 65 }).catch((err) => { 66 HiLog.e(TAG, "dealSmsReceiveData, err: " + JSON.stringify(err.message)); 67 result.code = common.int.FAILURE; 68 }); 69 await createMessagePromise; 70 let actionData = { 71 slotId: data.parameters.slotId, 72 telephone: result.telephone, 73 content: result.content, 74 isMms: false, 75 mmsSource: [] 76 } 77 this.insertMessageDetailBy(actionData, res => { 78 this.sendNotification(result.telephone, res.initDatas[0].id, result.content); 79 this.publishData(result.telephone, result.content); 80 }); 81 } 82 83 dealMmsReceiveData(data) { 84 let result = JSON.parse(data.data); 85 this.saveAttachment(result.mmsSource); 86 let content = commonService.getMmsContent(result.mmsSource); 87 let actionData: LooseObject = {}; 88 actionData.telephone = result.telephone; 89 actionData.content = content; 90 actionData.isMms = true; 91 actionData.mmsSource = result.mmsSource; 92 actionData.slotId = data.slotId; 93 this.insertMessageDetailBy(actionData, res => { 94 let notificationContent = this.getNotificationContent(result.mmsSource, content); 95 this.sendNotification(result.telephone, res.initDatas[0].id, notificationContent); 96 this.publishData(result.telephone, result.content); 97 }); 98 } 99 100 saveAttachment(mmsSource) { 101 for (let item of mmsSource) { 102 let baseUrl = item.msgUriPath; 103 let httpRequest = http.createHttp(); 104 httpRequest.request(common.string.MMS_URL, 105 { 106 method: http.RequestMethod.GET, 107 header: { 108 "Content-Type": "application/json", 109 }, 110 extraData: baseUrl, 111 readTimeout: 50000, 112 connectTimeout: 50000 113 }, (err, data) => { 114 HiLog.i(TAG, "saveAttachment, err: " + JSON.stringify(err.message)); 115 } 116 ); 117 } 118 } 119 120 getNotificationContent(mmsSource, themeContent) { 121 let content = common.string.EMPTY_STR; 122 if (mmsSource.length === 1) { 123 let item = mmsSource[0]; 124 switch (item.msgType) { 125 // Subject 126 case 0: 127 content = themeContent; 128 break; 129 // Pictures 130 case 1: 131 content = "(picture)" + themeContent; 132 break; 133 // Video 134 case 2: 135 content = "(video)" + themeContent; 136 break; 137 // Audio 138 case 3: 139 content = "(audio)" + themeContent; 140 break; 141 } 142 } else { 143 content = "(slide)" + mmsSource[0].content; 144 } 145 return content; 146 } 147 148 // Insert Received Data 149 insertMessageDetailBy(param, callback) { 150 let sendResults = []; 151 let sendResult = { 152 slotId: param.slotId, 153 telephone: param.telephone, 154 content: param.content, 155 sendStatus: 0 156 } 157 sendResults.push(sendResult); 158 let hasAttachment = commonService.judgeIsAttachment(param.mmsSource); 159 let actionData: LooseObject = {}; 160 actionData.slotId = param.slotId; 161 actionData.sendResults = sendResults; 162 actionData.isReceive = true; 163 actionData.ownNumber = common.string.EMPTY_STR; 164 actionData.isSender = true; 165 actionData.isMms = param.isMms; 166 actionData.mmsSource = param.mmsSource; 167 actionData.hasAttachment = hasAttachment; 168 this.insertSessionAndDetail(actionData, callback); 169 } 170 171 convertStrArray(sourceStr) { 172 let wby = sourceStr; 173 let length = wby.length; 174 let isDouble = (length % 2) == 0; 175 let halfSize = parseInt('' + length / 2); 176 HiLog.i(TAG, "convertStrArray, length=" + length + ", isDouble=" + isDouble); 177 if (isDouble) { 178 let number0xArray = new Array(halfSize); 179 for (let i = 0;i < halfSize; i++) { 180 number0xArray[i] = "0x" + wby.substr(i * 2, 2); 181 } 182 let numberArray = new Array(halfSize); 183 for (let i = 0;i < halfSize; i++) { 184 numberArray[i] = parseInt(number0xArray[i], 16); 185 } 186 return numberArray; 187 } else { 188 let number0xArray = new Array(halfSize + 1); 189 for (let i = 0;i < halfSize; i++) { 190 number0xArray[i] = "0x" + wby.substr(i * 2, 2); 191 } 192 number0xArray[halfSize] = "0x" + wby.substr((halfSize * 2) + 1, 1); 193 let numberArray = new Array(halfSize + 1); 194 for (let i = 0;i < halfSize; i++) { 195 numberArray[i] = parseInt(number0xArray[i], 16); 196 } 197 let last0x = "0x" + wby.substr(wby.length - 1, 1); 198 numberArray[halfSize] = parseInt(last0x); 199 return numberArray; 200 } 201 } 202 203 // Initializing the Database 204 async initRdb(data) { 205 HiLog.i(TAG, "initRdb, createRdbStore start: " ); 206 // Creating a Database 207 rdbStore = await ohosDataRdb.getRdbStore(globalThis.AbilityStageConstant, 208 { name: mmsTable.DB.MMSSMS.config.name }, mmsTable.DB.MMSSMS.version); 209 // Creating Database Tables 210 await rdbStore.executeSql(mmsTable.table.session, null); 211 212 if (data.event === common.string.SUBSCRIBER_EVENT) { 213 this.dealSmsReceiveData(data); 214 } else { 215 // MMS message receiving 216 this.dealMmsReceiveData(data); 217 } 218 219 } 220 221 insertSessionAndDetail(actionData, callback) { 222 let sendResults = actionData.sendResults; 223 let isReceive = actionData.isReceive; 224 if (sendResults.length == 0) { 225 return; 226 } 227 let value = this.dealSendResults(sendResults); 228 229 // Check whether a session list has been created. 230 this.querySessionByTelephone(value.telephone, res => { 231 HiLog.i(TAG, " insertSessionAndDetail, querySessionByTelephone code=" + res.code); 232 let response = res.response; 233 HiLog.i(TAG, " insertSessionAndDetail, querySessionByTelephone response.id=" + response.id); 234 if (res.code == common.int.SUCCESS && response.id <= 0) { 235 this.insertNoExitingSession(isReceive, value, actionData, callback); 236 } else { 237 this.insertExitingSession(response, value, actionData, callback); 238 } 239 }); 240 } 241 242 insertNoExitingSession(isReceive, value, actionData, callback) { 243 let unreadCount = 0; 244 if (isReceive) { 245 unreadCount = 1; 246 } 247 let valueBucket = { 248 "telephone": value.telephone, 249 "content": value.content, 250 "contacts_num": value.contractsNum, 251 "sms_type": value.smsType, 252 "unread_count": unreadCount, 253 "sending_status": value.sendStatus, 254 "has_draft": 0, 255 "time": value.timestamp, 256 "message_count": 1, 257 "has_mms": actionData.isMms ? 1 : 0, 258 "has_attachment": actionData.hasAttachment ? 1 : 0 259 } 260 this.insertSession(valueBucket, res => { 261 // Invoke the SMS database to insert SMS messages. 262 this.dealInsertMessageDetail(value, actionData, res.rowId, initDatas => { 263 let result = { 264 rowId: res.rowId, 265 initDatas: initDatas 266 } 267 callback(result); 268 }); 269 }); 270 } 271 272 insertExitingSession(response, param, actionData, callback) { 273 let sessionId = response.id; 274 // Invoke the SMS database to insert SMS messages. 275 let threadIds = [sessionId]; 276 let time = new Date(); 277 let unreadCount = 0; 278 if (actionData.isReceive) { 279 unreadCount = response.unreadCount; 280 unreadCount = unreadCount + 1; 281 } 282 let messageCount = response.messageCount; 283 messageCount = messageCount + 1; 284 let valueBucket = { 285 "content": param.content, 286 "unread_count": unreadCount, 287 "time": time.getTime(), 288 "sending_status": param.sendStatus, 289 "message_count": messageCount, 290 "has_mms": actionData.isMms ? 1 : 0, 291 "has_draft": 0, 292 "has_attachment": actionData.hasAttachment ? 1 : 0 293 }; 294 this.updateById(threadIds, valueBucket, res => { 295 // Invoke the SMS database to insert SMS messages. 296 this.dealInsertMessageDetail(param, actionData, sessionId, initDatas => { 297 let result = { 298 rowId: sessionId, 299 initDatas: initDatas 300 } 301 callback(result); 302 }); 303 }); 304 } 305 306 querySessionByTelephone(telephone, callback) { 307 let result: LooseObject = {}; 308 let queryPromise = this.querySessionByTelephoneRdb(telephone); 309 Promise.all([queryPromise]).then((res) => { 310 result.code = common.int.SUCCESS; 311 result.response = res[0]; 312 callback(result); 313 }).catch((err) => { 314 HiLog.e(TAG, "querySessionByTelephone, error: " + JSON.stringify(err.message)); 315 result.code = common.int.FAILURE; 316 callback(result); 317 }); 318 } 319 320 // Obtains the session list based on the mobile number. 321 async querySessionByTelephoneRdb(telephone) { 322 // Creating a query condition object 323 let predicates = new ohosDataRdb.RdbPredicates(MmsDatabaseHelper.TABLE.SESSION); 324 // If this parameter is left blank, all list data is queried. 325 if (telephone) { 326 await predicates.equalTo(mmsTable.sessionField.telephone, telephone); 327 } 328 // Obtain the result set. 329 let resultSet = await rdbStore.query(predicates); 330 // Obtain the first entry. 331 resultSet.goToFirstRow(); 332 let result: LooseObject = {}; 333 result.id = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.id))); 334 result.time = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.time))); 335 result.telephone = await resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.telephone)); 336 result.content = await resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.content)); 337 result.contactsNum = 338 await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.contactsNum))); 339 result.smsType = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.smsType))); 340 result.unreadCount = 341 await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.unreadCount))); 342 result.sendStatus = 343 await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.sendStatus))); 344 result.hasDraft = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.hasDraft))); 345 result.messageCount = 346 await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.messageCount))); 347 return result; 348 } 349 350 // insert 351 insertSession(valueBucket, callback) { 352 this.insertSessionRdb(valueBucket, callback); 353 } 354 355 insertSessionRdb(valueBucket, callback) { 356 HiLog.i(TAG, "insert session rdb 123"); 357 let insertPromise = rdbStore.insert(MmsDatabaseHelper.TABLE.SESSION, valueBucket); 358 let result: LooseObject = {}; 359 insertPromise.then((ret) => { 360 HiLog.i(TAG, "insert session rdb rowId: " + ret); 361 result.code = common.int.SUCCESS; 362 result.rowId = ret; 363 callback(result); 364 }).catch((err) => { 365 HiLog.e(TAG, "insert session rdb error: " + JSON.stringify(err.message)); 366 result.code = common.int.FAILURE; 367 callback(result); 368 }); 369 } 370 371 /** 372 * New data 373 */ 374 async insert(tableName, valueBucket) { 375 let promise = await rdbStore.insert(tableName, valueBucket); 376 let rowId = 0; 377 promise.then((ret) => { 378 rowId = ret; 379 HiLog.i(TAG, "insert, first success: " + rowId); 380 }).catch((err) => { 381 HiLog.e(TAG, "insert, err: " + JSON.stringify(err.message)); 382 }) 383 await promise; 384 return rowId; 385 } 386 387 dealInsertMessageDetail(param, actionData, threadId, callback) { 388 // Get the largest groupId 389 this.queryMaxGroupId(actionData, res => { 390 let maxGroupId = res == common.string.EMPTY_STR ? 0 : parseInt(res); 391 maxGroupId = maxGroupId + 1; 392 this.insertMessageDetailByGroupId(param, threadId, maxGroupId, actionData, callback); 393 }); 394 } 395 396 insertMessageDetailByGroupId(param, threadId, maxGroupId, actionData, callback) { 397 let initDatas = []; 398 let count = 0; 399 let sendResults = actionData.sendResults; 400 sendResults.forEach(sendResult => { 401 let insertDetail = { 402 slotId: actionData.slotId, 403 receiverNumber: common.string.EMPTY_STR, 404 senderNumber: common.string.EMPTY_STR, 405 smsType: param.smsType, 406 content: param.content, 407 sendStatus: 0, 408 sessionType: 0, 409 threadId: threadId, 410 isSender: actionData.isSender, 411 groupId: maxGroupId, 412 mmsSource: actionData.mmsSource, 413 isMms: actionData.isMms, 414 isRead: -1 415 }; 416 if (actionData.isReceive) { 417 insertDetail.receiverNumber = actionData.ownNumber; 418 insertDetail.senderNumber = sendResult.telephone; 419 insertDetail.isRead = 0; 420 } 421 this.insertMessageDetail(insertDetail, result => { 422 count++; 423 HiLog.i(TAG, "insertMessageDetailByGroupId, result: " + result); 424 let initData = { 425 id: result, 426 telephone: sendResult.telephone 427 }; 428 initDatas.push(initData); 429 if (count == sendResults.length) { 430 callback(initDatas); 431 } 432 }); 433 }) 434 } 435 436 dealSendResults(sendResults) { 437 let contractsNum = sendResults.length; 438 let telephone = common.string.EMPTY_STR; 439 let content = common.string.EMPTY_STR; 440 // Sending succeeded. 441 let sendStatus = 0; 442 for (let sendResult of sendResults) { 443 telephone = telephone + sendResult.telephone + common.string.COMMA; 444 content = sendResult.content; 445 sendStatus = sendResult.sendStatus; 446 } 447 telephone = telephone.substring(0, telephone.length - 1); 448 let smsType = 0; 449 if (contractsNum == 1 && telephoneUtils.judgeIsInfoMsg(telephone)) { 450 smsType = 1; 451 } 452 let timestamp = new Date().getTime(); 453 let result: LooseObject = {}; 454 result.contractsNum = contractsNum; 455 result.telephone = telephoneUtils.dealTelephoneSort(telephone); 456 result.content = content; 457 result.sendStatus = sendStatus; 458 result.smsType = smsType; 459 result.timestamp = timestamp; 460 return result; 461 } 462 463 insertMessageDetail(value, callback) { 464 let actionData: LooseObject = {}; 465 let time = new Date(); 466 let timeStr = time.getTime() + common.string.EMPTY_STR; 467 var stringValue = { 468 "slot_id": common.int.SIM_ONE, 469 "receiver_number": value.receiverNumber, 470 "sender_number": value.senderNumber, 471 "start_time": timeStr, 472 "end_time": timeStr, 473 "msg_type": value.isMms ? "1" : "0", 474 "sms_type": value.smsType, 475 "msg_title": value.content, 476 "msg_content": value.content, 477 "msg_state": value.sendStatus, 478 "operator_service_number": common.string.EMPTY_STR, 479 "msg_code": common.string.EMPTY_STR, 480 "session_id": value.threadId, 481 "is_lock": "0", 482 "is_read": value.isRead, 483 "is_collect": "0", 484 "session_type": value.sessionType, 485 "is_subsection": "0", 486 "is_sender": value.isSender, 487 "is_send_report": 0, 488 "group_id": value.groupId 489 }; 490 if (value.slotId != null) { 491 stringValue.slot_id = value.slotId; 492 } 493 actionData.stringValue = stringValue; 494 this.insertMessageDetailRdb(actionData, msgId => { 495 HiLog.i(TAG, "insertMessageDetail, msgId: " + msgId); 496 if (value.isMms) { 497 value.msgId = msgId; 498 this.batchInsertMmsPart(value); 499 } 500 callback(msgId); 501 }); 502 } 503 504 batchInsertMmsPart(value) { 505 let bacthmsParts = []; 506 for (let source of value.mmsSource) { 507 let stringValue = { 508 "msg_id": value.msgId, 509 "group_id": value.groupId, 510 "type": source.msgType, 511 "location_path": source.msgUriPath, 512 "content": source.content, 513 "recording_time": source.time, 514 "part_size": source.fileSize 515 }; 516 bacthmsParts.push(stringValue); 517 } 518 for (let stringValue of bacthmsParts) { 519 this.insertMmsPart(stringValue); 520 } 521 } 522 523 async insertMmsPart(stringValue) { 524 let dataAbilityHelper = await dataShare.createDataShareHelper(this.context, common.string.URI_MESSAGE_LOG); 525 let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_MMS_PART; 526 dataAbilityHelper.insert(managerUri, stringValue).then(data => { 527 }).catch(error => { 528 HiLog.e(TAG, "insertMmsPart, fail: " + JSON.stringify(error.meaasge)); 529 }); 530 } 531 532 // Inserting a single SMS message 533 async insertMessageDetailRdb(actionData, callback) { 534 // Obtains the DataAbilityHelper object. 535 let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_INFO_TABLE; 536 let dataAbilityHelper = await dataShare.createDataShareHelper(this.context, common.string.URI_MESSAGE_LOG); 537 let promise = dataAbilityHelper.insert(managerUri, actionData.stringValue); 538 await promise.then(data => { 539 callback(data); 540 }).catch(error => { 541 HiLog.e(TAG, "insertMessageDetailRdb, fail: " + JSON.stringify(error.message)); 542 }); 543 } 544 545 /** 546 * Update data based on the primary key ID. 547 * @param threadIds Session ID 548 * @return 549 */ 550 async updateById(threadIds, valueBucket, callback) { 551 HiLog.i(TAG, "updateById, threadIds: " + JSON.stringify(threadIds)); 552 if (threadIds.length != 0) { 553 for (let threadId of threadIds) { 554 // Creating a query condition object 555 let predicates = new ohosDataRdb.RdbPredicates(MmsDatabaseHelper.TABLE.SESSION); 556 await predicates.equalTo(mmsTable.sessionField.id, threadId); 557 this.update(predicates, valueBucket, res => { 558 callback(res); 559 }); 560 } 561 562 } 563 } 564 565 /** 566 * Update Interface 567 * @param predicates Update Condition 568 * @param predicates Update Value 569 * @return 570 */ 571 async update(predicates, valueBucket, callback) { 572 let changedRows = await rdbStore.update(valueBucket, predicates); 573 callback(changedRows); 574 } 575 576 /** 577 * Query the maximum group ID. 578 * @param actionData 579 * @param callBack 580 * @return 581 */ 582 queryMaxGroupId(actionData, callBack) { 583 this.queryMaxGroupIdDb(actionData, res => { 584 HiLog.i(TAG, "queryMaxGroupId, callback"); 585 callBack(res.maxGroupId); 586 }); 587 } 588 589 // Get the largest groupId 590 async queryMaxGroupIdDb(actionData, callback) { 591 let dataAbilityHelper = await dataShare.createDataShareHelper(this.context, common.string.URI_MESSAGE_LOG); 592 let resultColumns = [ 593 "maxGroupId" 594 ]; 595 let condition = new dataSharePredicates.DataSharePredicates(); 596 let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_MAX_GROUP; 597 dataAbilityHelper.query(managerUri, condition, resultColumns).then( resultSet => { 598 let result: LooseObject = {}; 599 if (resultSet != undefined) { 600 if (resultSet.goToLastRow()) { 601 result.maxGroupId = resultSet.getString(0); 602 } 603 } 604 callback(result); 605 }).catch(error => { 606 HiLog.e(TAG, "queryMaxGroupIdDb, error: " + JSON.stringify(error.message)); 607 }); 608 } 609 610 /** 611 * commonEvent publish data 612 */ 613 publishData(telephone, content) { 614 HiLog.i(TAG, "publishData, start"); 615 let actionData = { 616 telephone: telephone, 617 content: content 618 }; 619 commonEvent.publish(common.string.RECEIVE_TRANSMIT_EVENT, { 620 bundleName: common.string.BUNDLE_NAME, 621 subscriberPermissions: ['ohos.permission.RECEIVE_SMS'], 622 isOrdered: false, 623 data: JSON.stringify(actionData) 624 }, (res) => { 625 }); 626 } 627 628 async sendNotification(telephone, msgId, content) { 629 let telephones = [telephone]; 630 this.queryContactDataByTelephone(telephones, async (contracts) => { 631 HiLog.i(TAG, "sendNotification, callback"); 632 let actionData = this.dealContactParams(contracts, telephone); 633 if (content.length > 15) { 634 content = content.substring(0, 15) + "..."; 635 } 636 let title = telephone; 637 if(contracts.length > 0) { 638 title = contracts[0].displayName 639 } 640 let message = { 641 title: title, 642 text: content, 643 }; 644 actionData.message = message; 645 actionData.msgId = msgId; 646 actionData.unreadTotal = 0; 647 let params: LooseObject = { 648 mmsContext: this.context 649 }; 650 messageService.statisticalData(params, function (res) { 651 if (res.code == common.int.SUCCESS) { 652 actionData.unreadTotal= res.response.totalListCount; 653 HiLog.i(TAG, "sendNotification, callback actionData"); 654 } 655 NotificationService.getInstance().sendNotify(actionData); 656 }); 657 }); 658 } 659 660 dealContactParams(contracts, telephone) { 661 let actionData: LooseObject = {}; 662 let params = []; 663 if (contracts.length == 0) { 664 params.push({ 665 telephone: telephone, 666 }); 667 } else { 668 let contact = contracts[0]; 669 params.push({ 670 contactsName: contact.displayName, 671 telephone: telephone, 672 telephoneFormat: contact.detailInfo, 673 }); 674 } 675 actionData.contactObjects = JSON.stringify(params); 676 return actionData; 677 } 678 679 async queryContactDataByTelephone(telephones, callback) { 680 let resultColumns = [ 681 mmsTable.contactDataColumns.detailInfo, 682 mmsTable.contactDataColumns.displayName, 683 ]; 684 let contactDataAbilityHelper = 685 await dataShare.createDataShareHelper(this.context, common.string.URI_ROW_CONTACTS); 686 let condition = new dataSharePredicates.DataSharePredicates(); 687 let contactDataUri = common.string.URI_ROW_CONTACTS + common.string.CONTACT_DATA_URI; 688 condition.in(mmsTable.contactDataColumns.detailInfo, telephones); 689 condition.and(); 690 condition.equalTo(mmsTable.contactDataColumns.typeId, "5"); 691 contactDataAbilityHelper.query(contactDataUri, condition, resultColumns).then(resultSet => { 692 let contracts = []; 693 if (resultSet != undefined) { 694 while (resultSet.goToNextRow()) { 695 let contract = { 696 detailInfo: resultSet.getString(0), 697 displayName: resultSet.getString(1) 698 }; 699 contracts.push(contract); 700 } 701 } 702 callback(contracts); 703 }).catch(error => { 704 HiLog.e(TAG, "queryContactDataByTelephone error: " + JSON.stringify(error.message)); 705 }); 706 } 707 708 709} 710