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 router from '@system.router'; 16import Prompt from '@system.prompt'; 17import emitter from '@ohos.events.emitter'; 18 19import HiLog from '../../utils/HiLog' 20import common from '../../data/commonData' 21import commonEvent from '@ohos.commonEventManager'; 22import ContactsService from '../../service/ContactsService'; 23import ConversationService from '../../service/ConversationService'; 24import ConversationListService from '../../service/ConversationListService'; 25import LooseObject from '../../data/LooseObject' 26import commonService from '../../service/CommonService'; 27import settingService from '../../service/SettingService'; 28import { commonPasteboard } from '../../data/Pasteboard'; 29import telephoneUtil from '../../utils/TelephoneUtil'; 30import callService from '../../service/CallService'; 31import sendMsgService from '../../service/SendMsgService' 32import MmsPreferences from '../../utils/MmsPreferences'; 33import dateUtil from '../../utils/DateUtil'; 34import NotificationService from '../../service/NotificationService'; 35import simCardService from '../../service/SimCardService'; 36import commonCtrl from './common'; 37import AvatarColor from '../../model/common/AvatarColor'; 38 39const TAG = 'ConversationController'; 40const ANIMATION_DURATION = 1500; 41const TRANSFORM_SCALE_MIN = '1.0'; 42const TRANSFORM_SCALE_MAX = '3.0'; 43const COMMON_FILE_SIZE_STRING = '/300KB'; 44 45export default class ConversationController { 46 private static sInstance: ConversationController; 47 commonEventData: any = null; 48 commonCtrl = commonCtrl.getInstance(); 49 // SMS message list update flag 50 refresh: boolean = false; 51 // Message deletion prompt 52 strMsgDeleteDialogTip: Resource; 53 // Click Status 54 isClickStatus: boolean = false; 55 // Whether information is locked 56 hasLockMsg: boolean = false; 57 // Select Status 58 isSelectStatus: boolean = false; 59 // Whether to select lock information 60 isSelectLockMsg: boolean = false; 61 // More Actions 62 isShowMoreOperation: boolean = false; 63 // The default value is false for determining whether the current day is the same. 64 isLessOneDay: boolean = false; 65 // Check whether full-screen conditions are met. 66 isShowFullScreen: boolean = false; 67 // Check whether all the options are selected. 68 isMessageCheckAll: boolean = false; 69 // Is it just a recording? 70 isOnlyAudio: boolean = false; 71 // Deleted Count 72 selectDeleteMsgCount: number = 0; 73 // Text entered in the text box, which is also the content of the SMS message to be sent. 74 textValue: string = ''; 75 // Recording Animation Tasks 76 drawRecordingTaskId: number = 0; 77 // Tab option page. 0: Take a photo; 1: Take a picture; 2: Record a record; 3: More 78 tabIndex: number = 1; 79 // Text content of the tab option page 80 tabTextList: Array<any> = []; 81 // Recording Status 82 isRecordingStatus: boolean = true; 83 // Current recording time 84 curRecordingTime: string = '00:00'; 85 // Size of the current recording file (KB) 86 curSize: number = 0; 87 // Recording Start Time 88 startRecordTime: number = 0; 89 // Airplane mode 90 isFlightMode: boolean = false; 91 // Information Attachment Size Tips 92 msgSendTip: string = ''; 93 // Whether SMS messages can be sent. 94 canSendMessage: boolean = false; 95 // Whether the currently edited message is an MMS message 96 isEditMms: boolean = false; 97 // Size of the MM attachment to be edited. 98 curEdtFileSize: number = 0; 99 // Obtains the time display of a single selection. 100 mmsTime: string = ''; 101 // SMS and MMS 102 isMmsType: Resource; 103 // Recipient 104 isSendRecipient: boolean; 105 // Contact First Name 106 strContactsName: string = ''; 107 // Contact Phone Number 108 strContactsNumber: string = ''; 109 // Contact Phone Number Formatting 110 strContactsNumberFormat: string = ''; 111 // The attachment type is business card. 112 isVCard: boolean = false; 113 // Indicates whether the information is created. 114 isNewMsg: boolean = false; 115 // Number of Contacts 116 contactsNum: number = 0; 117 // business card 118 vCard: {}; 119 // MM Edit List 120 mmsEditList: Array<any> = []; 121 // Information List 122 mmsList: Array<any> = []; 123 // Index of the selected information 124 mmsIndex: number = 0; 125 // Initial x-position 126 rawX: string = ''; 127 // Initial y-position 128 rawY: string = ''; 129 // Thumbnails in Gallery 130 pictureListFromGallery: Array<any> = []; 131 // Tab Title 132 tabTitleText: Resource; 133 // Send Toolbar Distance from Bottom Position 134 sendBarMarginBottom: number = 0; 135 // Tab Height 136 tabHeight: number = common.int.TAB_HEIGHT; 137 // Restoration task ID. 138 restoreTimeoutId: number = 0; 139 // Whether the animation is actually executed 140 isTabHeightAnimation: boolean = false; 141 // 0: default; 1: slide; 2: full screen 142 tabSlideStatus: number = 0; 143 // Sliding distance 144 slideDistance: number = 0; 145 // Start point coordinate of the slide 146 slideStartPoint: LooseObject = { 147 'x': 0, 148 'y': 0 149 }; 150 // Whether to slide up 151 isTabSlideUp: number = 0; 152 // Contact list, which is obtained from the contact app and used as an attachment for sending MMS messages. 153 contactListFromContactApp: Array<any> = []; 154 // Card slot 155 slotId: number = 0; 156 // Selected Contacts 157 selectContacts: Array<any> = []; 158 // Content in the recipient text box 159 receiveContactValue: string = ''; 160 // Controls the display and hiding of the last div. 161 isSendStatus: boolean = false; 162 // ID of the session list. 163 threadId: number = 0; 164 // Indicates whether the page is a details page. 165 isDetail: boolean = true; 166 // Subscript to be resent 167 reSendIndex: number = 0; 168 // Whether the replication option is visible 169 showText: boolean = true; 170 // Search for the value passed 171 searchKey: string = ''; 172 // Is it grass? 173 isDraft: boolean = false; 174 // Contents of the draft 175 draftContent: string = ''; 176 draftGroupId: number = 0; 177 // Can I double-click to cancel sending 178 recallMessagesFlag: boolean = false; 179 // Double-click Cancel Status 180 doubleClickStatus: boolean = false; 181 // Dynamic change sign from bottom 182 distanceBottomFlag: boolean = false; 183 // Deleting a Details Page 184 hasDetailDelete: boolean = false; 185 // Whether a contact exists 186 hasExitContact: boolean = false; 187 // Create a page for fetching and sending. 188 isNewRecallMessagesFlag: boolean = false; 189 // Recording animation 190 recordingAnimation: LooseObject = {}; 191 // Animation Style Properties 192 animationOptions: LooseObject = {}; 193 // Animation Style Attribute Object 194 animationFrames: LooseObject = {}; 195 // Default rear camera 196 cameraPattern: string = 'back'; 197 pattern: string = ''; 198 // Lock or Not 199 hasLock: boolean = false; 200 // Highlight Message Type 201 highlightsType: number = 0; 202 // Highlight Message Content 203 highlightsText: string = ''; 204 timeFormat: string = '00:01'; 205 // 0: normal; 1: notification 206 smsType: number = 0; 207 isPicCheckboxClicked: boolean = false; 208 // Whether to support sending reports 209 hasReport: boolean = false; 210 messageType: number = common.MESSAGE_TYPE.NORMAL; 211 textareaDatasource: Array<any> = []; 212 pptTotalCount: number = 0; 213 selectedTextareaIdx: -1; 214 hasImage: boolean = false; 215 hasContent: boolean = false; 216 hasVcard: boolean = false; 217 mmsAddType: number = 0; 218 picItemSelectedIndex: number = -1; 219 slideDuration: number = 5; 220 slideDurations: Array<any> = []; 221 hasDouble: boolean = true; 222 searchContent: string = ''; 223 // Time 224 mmsDateSet: Set<any> = new Set(); 225 photoFirstName: string = ''; 226 portraitColor: string = ''; 227 reg: RegExp = /^[\u4e00-\u9fa5_a-zA-Z]+$/; 228 scroller: Scroller = new Scroller(); 229 230 static getInstance() { 231 if (ConversationController.sInstance == null) { 232 ConversationController.sInstance = new ConversationController(); 233 } 234 return ConversationController.sInstance; 235 } 236 237 onInit() { 238 HiLog.i(TAG, 'onInit'); 239 this.initRouterData(); 240 this.initData(); 241 if (this.hasDouble) { 242 this.initNewPageContacts(); 243 this.hasDouble = false; 244 } 245 // Obtains the actual data. You do not need to query the data when creating new data. 246 if (!this.isNewMsg) { 247 this.queryMessageDetail(this.strContactsNumber, this.threadId, () => { 248 }); 249 this.scroller.scrollToIndex(this.mmsList.length - 1) 250 } 251 let actionData: LooseObject = {}; 252 actionData.threadId = this.threadId; 253 actionData.hasRead = common.is_read.UN_READ; 254 NotificationService.getInstance().cancelMessageNotify(actionData); 255 NotificationService.getInstance().updateBadgeNumber(); 256 } 257 258 onShow() { 259 HiLog.i(TAG, 'onShow'); 260 // Check whether the Send button can be clicked. 261 this.judgeSendBtnCanClicked(); 262 // Subscribe to PA 263 this.subscribeDetail(); 264 // Check whether a contact exists. 265 this.judgeContactExists(); 266 // Initialize the forwarded data 267 this.initTransmitMeg(); 268 // Forwarding and sending 269 this.transmitSend(); 270 } 271 272 onHide() { 273 HiLog.i(TAG, 'onHide'); 274 this.unSubscribeDetail(); 275 } 276 277 initData() { 278 this.strMsgDeleteDialogTip = $r('app.string.msg_delete_dialog_con_tip2', 279 this.selectDeleteMsgCount 280 ); 281 this.tabTextList = [ 282 // $r('app.string.msg_take_photos'), 283 // $r('app.string.msg_picture'), 284 // $r('app.string.msg_record'), 285 // $r('app.string.more_low') 286 ]; 287 this.animationOptions = { 288 duration: ANIMATION_DURATION, 289 easing: 'linear', 290 fill: 'forwards', 291 iterations: 'Infinity', 292 }; 293 this.animationFrames = [ 294 { 295 transform: { 296 scale: TRANSFORM_SCALE_MIN 297 } 298 }, 299 { 300 transform: { 301 scale: TRANSFORM_SCALE_MAX 302 } 303 } 304 ]; 305 // this.pattern = $r('app.string.camera_post'); 306 this.initSlideDurations(); 307 } 308 309 initSlideDurations() { 310 let arr = []; 311 for (let i = 1; i <= 10; i++) { 312 arr.push(i); 313 } 314 this.slideDurations = arr; 315 } 316 317 release() { 318 this.textValue = ''; 319 this.receiveContactValue = ''; 320 this.isDraft = false; 321 this.mmsList = []; 322 } 323 324 initNewPageContacts() { 325 let transmitContacts = []; 326 if (this.strContactsNumber) { 327 let contactsNames = this.strContactsName.split(','); 328 let telephones = this.strContactsNumber.split(','); 329 let telephoneFormat = this.strContactsNumberFormat.split(','); 330 for (let index in contactsNames) { 331 let item: LooseObject = {}; 332 item.contactName = contactsNames[index]; 333 item.telephone = telephones[index]; 334 if (contactsNames[index] == common.string.EMPTY_STR && 335 telephoneFormat[index] == common.string.EMPTY_STR) { 336 item.telephoneFormat = telephones[index]; 337 } else { 338 item.telephoneFormat = telephoneFormat[index]; 339 } 340 item.headImage = common.string.EMPTY_STR; 341 item.select = false; 342 transmitContacts.push(item); 343 } 344 } 345 this.commonCtrl.paramContact.transmitContacts = transmitContacts; 346 this.commonCtrl.paramContact.isSelectContact = false; 347 this.commonCtrl.paramContact.isNewRecallMessagesFlag = false; 348 } 349 350 initRouterData() { 351 let routerParams: LooseObject = router.getParams(); 352 this.strContactsName = 353 routerParams.strContactsName == undefined ? '' : routerParams.strContactsName; 354 this.strContactsNumber = 355 routerParams.strContactsNumber == undefined ? '' : routerParams.strContactsNumber; 356 this.strContactsNumberFormat = 357 routerParams.strContactsNumberFormat == undefined ? '' : routerParams.strContactsNumberFormat; 358 this.contactsNum = routerParams.contactsNum == undefined ? 0 : routerParams.contactsNum; 359 this.threadId = routerParams.threadId == undefined ? 0 : routerParams.threadId; 360 this.isDraft = routerParams.isDraft == undefined ? false : routerParams.isDraft; 361 this.draftContent = routerParams.draftContent == undefined ? '' : routerParams.draftContent; 362 this.searchContent = routerParams.searchContent == undefined ? '' : routerParams.searchContent; 363 this.isNewMsg = routerParams.isNewMsg == undefined ? false : routerParams.isNewMsg; 364 this.portraitColor = AvatarColor.background.Color[Math.abs(this.threadId) % 6]; 365 this.photoFirstNameDeal(this.strContactsName); 366 this.dealSpecialPhoneNumber(); 367 } 368 369 photoFirstNameDeal(strContactsName) { 370 if (strContactsName !== common.string.EMPTY_STR && this.reg.test(strContactsName.substring(0, 1))) { 371 this.photoFirstName = strContactsName.substring(0, 1).toUpperCase() 372 } else { 373 this.photoFirstName = '-1' 374 } 375 } 376 377 // Handle invalid phone numbers that contain #, *, and dots in redirection from other applications. 378 // Replace them with spaces. 379 dealSpecialPhoneNumber() { 380 if (!this.isPhoneNumber(this.strContactsNumber)) { 381 this.strContactsNumber = this.replaceCode(this.strContactsNumber); 382 this.strContactsNumberFormat = this.replaceCode(this.strContactsNumberFormat); 383 if (this.strContactsName != common.string.EMPTY_STR) { 384 this.strContactsName = common.string.EMPTY_STR; 385 } 386 } 387 } 388 389 replaceCode(str) { 390 if (str != null && str.length != 0) { 391 return str.replace(new RegExp(/e|-|#|\*|\./, 'g'), common.string.EMPTY_STR); 392 } else { 393 return common.string.EMPTY_STR; 394 } 395 } 396 397 titleBarCancel() { 398 // Cancel button 399 this.cancelCheckedAll(); 400 this.setSelectStatus(false); 401 } 402 403 onBackPress() { 404 if (this.isSelectStatus) { 405 // Multi-choice status 406 this.isSelectStatus = false; 407 this.cancelCheckedAll(); 408 return true; 409 } 410 let source = this.getMmsSource(); 411 this.insertAndUpdateSessionDraft(source, () => { 412 this.release(); 413 router.back(); 414 }); 415 return true; 416 } 417 418 insertAndUpdateSessionDraft(source, callback) { 419 // Create a draft. If the selected contact or content is empty, delete the draft. 420 if (this.isNewMsg && this.isDraft) { 421 if ((this.selectContacts.length == 0 && this.receiveContactValue == common.string.EMPTY_STR) || 422 (this.textValue == common.string.EMPTY_STR && source.length == 0)) { 423 let condition: LooseObject = {}; 424 condition.threadId = this.threadId; 425 ConversationListService.getInstance().deleteSessionByCondition(condition, null, null); 426 this.deleteDraftData(); 427 } 428 } 429 let actionData: LooseObject = {}; 430 actionData.slotId = this.slotId; 431 actionData.threadId = this.threadId; 432 actionData.receiveContactValue = common.string.EMPTY_STR; 433 actionData.selectContacts = []; 434 actionData.content = this.textValue; 435 actionData.isReceive = false; 436 actionData.ownNumber = common.string.EMPTY_STR; 437 actionData.isSender = common.is_sender.NO; 438 actionData.hasDraft = common.has_draft.HAVE; 439 actionData.hasReport = settingService.judgeIsDeliveryReport(this.isEditMms); 440 actionData.isMms = this.isEditMms; 441 actionData.mmsSource = source; 442 actionData.groupId = this.draftGroupId; 443 actionData.messageType = this.messageType; 444 actionData.hasAttachment = commonService.judgeIsAttachment(source); 445 actionData.isDraft = this.isDraft; 446 // The draft does not exist or the draft needs to be updated. The draft data on the new page needs to be saved. 447 if (this.textValue != common.string.EMPTY_STR || source.length !== 0) { 448 actionData.isNewMsg = this.isNewMsg; 449 if (this.isNewMsg) { 450 // If the selected contact is not empty 451 if (this.selectContacts.length > 0) { 452 actionData.selectContacts = this.selectContacts; 453 ConversationListService.getInstance().insertSessionDraft(actionData, callback, null); 454 } 455 // If the recipient input field is not empty 456 else if (this.receiveContactValue != common.string.EMPTY_STR) { 457 actionData.receiveContactValue = this.receiveContactValue; 458 // If the number entered in the text box is invalid, the system does not save the draft when the 459 // Back key is pressed. 460 if (this.isPhoneNumber(this.receiveContactValue)) { 461 ConversationListService.getInstance().insertSessionDraft(actionData, callback, null); 462 } else if (this.isDraft) { 463 // If the current draft is in draft state and the entered number is invalid, the current draft 464 // is deleted. 465 let condition: LooseObject = {}; 466 condition.threadId = this.threadId; 467 ConversationListService.getInstance().deleteSessionByCondition(condition, null, null); 468 this.deleteDraftData(); 469 callback(); 470 } else { 471 callback(); 472 } 473 } else { 474 callback(); 475 } 476 } else { 477 // This is not a new scenario. 478 actionData.telephone = this.strContactsNumber; 479 ConversationListService.getInstance().insertSessionDraft(actionData, callback, null); 480 } 481 } else if (!this.isNewMsg && this.isDraft) { 482 // If a draft exists, perform the following operations: 483 this.dealSessionDraft(source); 484 callback(); 485 } else { 486 callback(); 487 } 488 } 489 490 // When the draft logic is set, the text content is empty and the page is not created, the session list data needs 491 // to be updated. 492 dealSessionDraft(source) { 493 let valueBucket: LooseObject = { 494 'content': common.string.EMPTY_STR, 495 'has_draft': common.has_draft.NO, 496 'time': new Date().getTime(), 497 'has_mms': common.has_mms.NO, 498 'has_attachment': common.has_attachment.NO 499 } 500 // Query the last content in the list 501 let length: number = this.mmsList.length; 502 if (length > 0) { 503 let item: LooseObject = this.mmsList[length - 1]; 504 valueBucket.content = item.content; 505 valueBucket.has_mms = item.isMsm ? common.has_mms.HAVE : common.has_mms.NO; 506 valueBucket.has_attachment = item.isMsm ? common.has_attachment.HAVE : common.has_attachment.NO; 507 } 508 let condition: LooseObject = {}; 509 condition.threadId = this.threadId; 510 ConversationListService.getInstance().updateSessionByCondition(condition, valueBucket, null, null); 511 this.deleteDraftData(); 512 this.isDraft = false; 513 } 514 515 cancelCheckedAll() { 516 for (let element of this.mmsList) { 517 element.isCbChecked = false; 518 } 519 } 520 521 clickGroupCheckAll() { 522 for (let element of this.mmsList) { 523 element.isCbChecked = !this.isMessageCheckAll; 524 } 525 if (this.isMessageCheckAll) { 526 this.setMessageCheckAll(common.int.CHECKBOX_SELECT_NONE); 527 } else { 528 this.setMessageCheckAll(common.int.CHECKBOX_SELECT_ALL); 529 } 530 } 531 532 setMessageCheckAll(type) { 533 HiLog.i(TAG, 'setMessageCheckAll, isSelectStatus=' + this.isSelectStatus); 534 if (!this.isSelectStatus) { 535 return; 536 } 537 if (type == common.int.CHECKBOX_SELECT_ALL) { 538 HiLog.i(TAG, 'setMessageCheckAll, CHECKBOX_SELECT_ALL'); 539 this.selectDeleteMsgCount = this.mmsList.length; 540 this.isMessageCheckAll = true; 541 this.hasReport = false; 542 let countLock = 0; 543 // Check whether all of them are locked. 544 for (let element of this.mmsList) { 545 if (element.isCbChecked && element.isLock) { 546 countLock++; 547 } 548 } 549 if (this.selectDeleteMsgCount == countLock) { 550 this.hasLock = true; 551 } 552 } else if (type == common.int.CHECKBOX_SELECT_NONE) { 553 HiLog.i(TAG, 'setMessageCheckAll, CHECKBOX_SELECT_NONE'); 554 this.selectDeleteMsgCount = 0; 555 this.isMessageCheckAll = false; 556 this.hasLock = false; 557 this.hasReport = false; 558 } else { 559 // The default value is CHECKBOX_SELECT_UNKNOWN. Check whether there is any unselected item. 560 HiLog.i(TAG, 'setMessageCheckAll, else'); 561 this.checkBoxSelectUnknow(); 562 } 563 } 564 565 checkBoxSelectUnknow() { 566 HiLog.i(TAG, 'checkBoxSelectUnknow, start'); 567 // The default value is CHECKBOX_SELECT_UNKNOWN. Check whether there is any unselected item. 568 this.isMessageCheckAll = true; 569 this.selectDeleteMsgCount = 0; 570 let countLock = 0; 571 let countReport = 0; 572 for (let element of this.mmsList) { 573 if (element.isCbChecked) { 574 this.selectDeleteMsgCount++; 575 } else if (this.isMessageCheckAll) { 576 this.isMessageCheckAll = false; 577 } 578 if (element.isCbChecked && element.isLock) { 579 countLock++; 580 } 581 if (element.isCbChecked && element.hasReport) { 582 countReport++; 583 } 584 } 585 // If one is selected and there is a lock 586 if (this.selectDeleteMsgCount == 1 && countLock > 0) { 587 this.hasLock = true; 588 } else { 589 this.hasLock = false; 590 } 591 // If all are checked and all are locked 592 if (this.selectDeleteMsgCount == countLock) { 593 this.hasLock = true; 594 } 595 if (countReport == 1) { 596 this.hasReport = true; 597 } else { 598 this.hasReport = false; 599 } 600 } 601 602 listCheckBoxChange(index, e) { 603 // When API 7 is used, the isOn type is not boolean but is of the number type. If the isOn type is displayed, 604 // an error may occur. 605 let isCheck: string = e 606 // this.messageList[index].isCbChecked = isCheck == '1' ? true : false; 607 let item = this.mmsList[index]; 608 item.isCbChecked = isCheck == '1' ? true : false; 609 HiLog.i(TAG, `listCheckBoxChange, isCbChecked=${item.isCbChecked}, index=${index}, mmsIndex=${this.mmsIndex}`); 610 this.mmsIndex = index; 611 this.hasReport = item.hasReport; 612 this.setMessageCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); 613 if (this.selectDeleteMsgCount == 1) { 614 let item; 615 for (let element of this.mmsList) { 616 if (element.isCbChecked) { 617 item = element; 618 break; 619 } 620 } 621 if (item != null) { 622 this.setGroupMoreMenu(item); 623 } 624 } 625 } 626 627 setGroupMoreMenu(item) { 628 if (!item.isMsm) { 629 this.hasContent = true; 630 return; 631 } 632 this.hasContent = commonService.judgeIsSelectText(item.mms); 633 this.hasImage = commonService.judgeIsImage(item.mms); 634 if (item.isMsm && item.mms.length == 1 && item.mms[0].type == common.MSG_ITEM_TYPE.CARD) { 635 this.hasVcard = true; 636 } else { 637 this.hasVcard = false; 638 } 639 } 640 641 longPressSelected(index) { 642 switch (index) { 643 case 0: 644 // duplicating 645 this.copyText(); 646 break; 647 case 1: 648 // Forwarding 649 this.transmitMsgSingle(); 650 break; 651 case 2: 652 // Delete 653 this.deleteDialogShow(); 654 break; 655 case 3: 656 // Select Text 657 this.gotoTextSelect(this.mmsIndex); 658 break; 659 case 4: 660 // more 661 this.more(); 662 break; 663 case 5: 664 // Save 665 this.saveImage(); 666 break; 667 default: 668 break; 669 } 670 } 671 672 // Initializing Forwarding Data 673 initTransmitMeg() { 674 let routerParams: LooseObject = router.getParams(); 675 if (routerParams.transmitFlag) { 676 this.threadId = routerParams.threadId; 677 this.slotId = MmsPreferences.getInstance().getSendMessageSlotId(); 678 this.contactsNum = this.contactsNum; 679 this.strContactsName = routerParams.strContactsName; 680 this.strContactsNumber = routerParams.strContactsNumber; 681 this.strContactsNumberFormat = routerParams.strContactsNumberFormat; 682 this.initNewPageContacts(); 683 } 684 } 685 686 // Forwarding and sending 687 transmitSend() { 688 // Send Flag 689 let transmitFlag = router.getParams().transmitFlag; 690 //Indicates whether the slide page is an MMS message. 691 let isSlideDetail = router.getParams().isSlideDetail; 692 if (transmitFlag) { 693 if (isSlideDetail) { 694 // Indicates whether the currently edited message is an MMS message. 695 this.isEditMms = true; 696 //this.mmsTransmitSend(); 697 } else { 698 this.generalTransmitSend(); 699 } 700 } 701 } 702 703 generalTransmitSend() { 704 let transmitSource: Array<LooseObject> = <Array<LooseObject>> router.getParams().transmitSource; 705 let isSource = router.getParams().isContainerOriginSource; 706 this.canSendMessage = false; 707 for (let element of transmitSource) { 708 let content = common.string.EMPTY_STR; 709 if (isSource && !element.isMsm) { 710 content = element.contentInfo + element.content; 711 } else { 712 content = element.content; 713 } 714 let actionData = { 715 content: content, 716 mmsSource: element.mms, 717 msgUriPath: element.msgUriPath 718 }; 719 this.delayTransmitSend(actionData, element.isMsm); 720 } 721 } 722 723 delayTransmitSend(element, isMms) { 724 this.queryMessageDetail(this.strContactsNumber, this.threadId, () => { 725 this.sendSms(element.content, element.msgUriPath, isMms, element.mmsSource); 726 }); 727 } 728 729 sendSms(content, msgUriPath, isMms, mmsSource): void { 730 // Sending an SMS Message on a Full-Screen Page 731 this.isSendStatus = true; 732 // Initialize the data to be sent. 733 this.initSendSms(content, msgUriPath, isMms, mmsSource); 734 this.slotId = MmsPreferences.getInstance().getSendMessageSlotId(); 735 let actionData: LooseObject = {}; 736 actionData.slotId = this.slotId; 737 actionData.destinationHost = this.strContactsNumber; 738 actionData.content = content; 739 actionData.isEditMms = isMms; 740 this.dealNewRecallMessagesFlag(this.mmsList); 741 HiLog.i(TAG, 'sendSms send start'); 742 // Cancel Sending and Normal Sending Methods 743 this.sendInterval(actionData, this.mmsList); 744 HiLog.i(TAG, 'sendSms send end'); 745 if (this.isEditMms) { 746 this.isEditMms = false; 747 } 748 } 749 750 initSendSms(content, msgUriPath, isMms, mmsSource) { 751 // Obtain the day of the week. 752 let item: LooseObject = {}; 753 item.date = common.string.EMPTY_STR; 754 item.time = $r('app.string.just'); 755 item.timeMillisecond = new Date().getTime(); 756 dateUtil.convertTimeStampToDateWeek(item, false); 757 dateUtil.fullDate(item); 758 item.content = content; 759 if (isMms) { 760 item.msgType = common.MSG_ITEM_TYPE.IMAGE; 761 item.msgUriPath = msgUriPath; 762 } 763 item.isFullScreenImg = false; 764 let time = (this.mmsEditList.length != 0 && (this.mmsEditList[0].type == 3 || this.mmsEditList[0].type == 5)) ? 765 this.mmsEditList[0].time : common.string.SUCCESS; 766 item.audioTime = time; 767 item.isCbChecked = false; 768 item.isLock = false; 769 item.isStared = false; 770 item.isReceive = false; 771 item.sendStatus = 1; 772 item.subId = this.slotId; 773 item.isMsm = isMms; 774 this.contactsNum = this.strContactsNumber.split(',').length; 775 item.contactsNum = this.contactsNum; 776 item.cancelTimeCount = common.int.CANCEL_TIME_COUNT; 777 item.mmsEditListTemp = this.fillmmsEditListTemp(msgUriPath, isMms); 778 if (this.contactsNum > 1) { 779 item.completeNumber = 0; 780 item.failuresNumber = 0; 781 } 782 item.hasReport = settingService.judgeIsDeliveryReport(item.isMsm); 783 item.mmsSource = mmsSource; 784 if (this.isEditMms || isMms) { 785 item.msgShowType = commonService.getDisplay(mmsSource); 786 commonService.setItemMmsContent(item, mmsSource); 787 item.content = this.dealItemContent(item.msgShowType, item.content, mmsSource); 788 } else { 789 item.msgShowType = common.MESSAGE_SHOW_TYPE.NORMAL; 790 } 791 this.mmsList.push(item); 792 } 793 794 fillmmsEditListTemp(msgUriPath, isMsm) { 795 let mmsEditListTemp = []; 796 if (this.recallMessagesFlag && isMsm) { 797 let item: LooseObject = {}; 798 item.type = common.MSG_ITEM_TYPE.IMAGE; 799 item.uriPath = msgUriPath; 800 mmsEditListTemp.push(item); 801 } 802 return mmsEditListTemp; 803 } 804 805 dealNewRecallMessagesFlag(mmsList) { 806 let count = common.int.MESSAGE_CODE_ZERO; 807 for (let index in mmsList) { 808 let item = mmsList[index]; 809 if (!item.isDraft) { 810 count++; 811 } 812 } 813 if (count == common.int.MESSAGE_CODE_ONE) { 814 this.isNewRecallMessagesFlag = true; 815 this.commonCtrl.paramContact.isNewRecallMessagesFlag = true; 816 } 817 if (count == common.int.MESSAGE_CODE_ZERO && this.isNewRecallMessagesFlag) { 818 this.isNewMsg = true; 819 this.isNewRecallMessagesFlag = false; 820 } 821 } 822 823 // Single Forwarding 824 transmitMsgSingle() { 825 // Forwarding a single message 826 let item: LooseObject = this.mmsList[this.mmsIndex]; 827 let transmitObj: LooseObject = {}; 828 let contactsName: string | Resource = common.string.EMPTY_STR; 829 if (this.strContactsName && this.strContactsName != common.string.EMPTY_STR) { 830 contactsName = $r('app.string.transmitContentReceive', this.strContactsName); 831 } else { 832 contactsName = $r('app.string.transmitContentReceive', this.strContactsNumberFormat); 833 } 834 transmitObj.contactsName = contactsName; 835 transmitObj.isMsm = item.isMsm; 836 transmitObj.msgShowType = item.msgShowType; 837 transmitObj.mms = item.mms; 838 transmitObj.content = item.content; 839 transmitObj.msgUriPath = item.msgUriPath ? item.msgUriPath : common.string.EMPTY_STR; 840 transmitObj.contentInfo = common.string.EMPTY_STR; 841 transmitObj.msgType = item.msgType; 842 let transmitContentList = []; 843 transmitContentList.push(transmitObj); 844 let transmitContent = item.isReceive ? contactsName : $r('app.string.transmitContent'); 845 this.jumpTransmitMsg(transmitContent, transmitContentList, item.isMsm); 846 } 847 848 jumpTransmitMsg(transmitContent, transmitContentList, isMms) { 849 router.push({ 850 uri: 'pages/transmitmsg/transmitMsg', 851 params: { 852 threadId: this.threadId, 853 doubleCard: false, 854 transmitContent: transmitContent, 855 transmitContentList: transmitContentList, 856 isMulti: true, 857 isMms: isMms, 858 isMyStartPage: false 859 } 860 }); 861 } 862 863 // Delete a dialog box. 864 deleteDialogShow() { 865 this.strMsgDeleteDialogTip = $r('app.string.msg_delete_dialog_con_tip1'); 866 let item = this.mmsList[this.mmsIndex]; 867 item.isShowMsgLongMenu = false 868 HiLog.i(TAG, 'deleteDialogShow, isShowMsgLongMenu=' + item.isShowMsgLongMenu); 869 this.hasLockMsg = item.isLock; 870 if (!item.isMsm) { 871 this.hasContent = true; 872 return; 873 } 874 } 875 876 // more 877 more() { 878 this.setTabOperationStatus(false); 879 this.distanceBottomFlag = false; 880 let item = this.mmsList[this.mmsIndex]; 881 882 item.isCbChecked = !item.isCbChecked; 883 item.isShowMsgLongMenu = false; 884 HiLog.i(TAG, 'more, isShowMsgLongMenu=' + item.isShowMsgLongMenu); 885 this.setSelectStatus(true); 886 this.hasDetailDelete = false; 887 this.setMessageCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); 888 this.hasReport = item.hasReport; 889 this.setGroupMoreMenu(item); 890 } 891 892 setTabOperationStatus(flag) { 893 this.isShowMoreOperation = flag; 894 // Value type. The HTML page is refreshed only when the value type is numeric. 895 if (flag) { 896 this.sendBarMarginBottom = common.int.TAB_HEIGHT; 897 } else { 898 this.sendBarMarginBottom = 0; 899 } 900 } 901 902 setSelectStatus(isSelect) { 903 this.isSelectStatus = isSelect; 904 } 905 906 // Event of pressing and holding an SMS message 907 mmsListLongPress(index) { 908 for (let i = 0; i < this.mmsList.length; i++) { 909 if (index == i) { 910 this.mmsList[index].isShowMsgLongMenu = true; 911 } else { 912 this.mmsList[i].isShowMsgLongMenu = false; 913 } 914 } 915 this.refresh = !this.refresh 916 this.mmsIndex = index; 917 if (this.isSelectStatus) { 918 this.mmsList[index].isCbChecked = !this.mmsList[index].isCbChecked; 919 this.setMessageCheckAll(common.int.CHECKBOX_SELECT_UNKNOWN); 920 return; 921 } 922 this.hasContent = false; 923 this.hasImage = false; 924 let item = this.mmsList[index]; 925 let menuId = common.string.EMPTY_STR; 926 if (item.isMsm) { 927 this.setGroupMoreMenu(item); 928 // menuId = 'menu_long_press_mms'; 929 } else { 930 // menuId = 'menu_long_press'; 931 } 932 // setTimeout(() => { 933 // this.$element(menuId).show({ 934 // x: this.rawX, 935 // y: this.rawY 936 // }); 937 // },100); 938 } 939 940 touchStart(e) { 941 this.rawX = e.globalX; 942 this.rawY = e.globalY; 943 944 } 945 946 deleteDialogCancel() { 947 // Cancel Ejection 948 this.isSelectLockMsg = false; 949 HiLog.i(TAG, 'deleteDialogCancel, isSelectLockMsg=false') 950 } 951 952 deleteDialogConfirm() { 953 let groupIds = []; 954 let mmsListCopy = []; 955 HiLog.i(TAG, 'deleteDialogConfirm, isSelectStatus=' + this.isSelectStatus); 956 if (this.isSelectStatus) { 957 // Delete the selected item through the filter. 958 for (let element of this.mmsList) { 959 if (!element.isCbChecked || (element.isLock && !this.isSelectLockMsg)) { 960 this.setDateShow(element, mmsListCopy); 961 mmsListCopy.push(element); 962 } else { 963 groupIds.push(element.groupId); 964 } 965 } 966 // Set to non-multi-choice status 967 this.setSelectStatus(false); 968 this.mmsList = mmsListCopy; 969 } else if ((this.mmsList[this.mmsIndex] != undefined && !this.mmsList[this.mmsIndex].isLock) || this.isSelectLockMsg) { 970 let item = this.mmsList[this.mmsIndex]; 971 for (let i = 0; i < this.mmsList.length; i++) { 972 if (this.mmsIndex == i) { 973 continue; 974 } else { 975 this.setDateShow(this.mmsList[i], mmsListCopy); 976 mmsListCopy.push(this.mmsList[i]); 977 } 978 } 979 this.mmsList = mmsListCopy; 980 HiLog.i(TAG, 'deleteDialogConfirm, mmsList.length=' + this.mmsList.length); 981 groupIds.push(item.groupId); 982 } 983 this.isSelectLockMsg = false; 984 this.cancelCheckedAll(); 985 if (groupIds.length > 0) { 986 this.deleteMessageByGroupIds(groupIds); 987 // Check whether the length of the deleted list is 0. 988 if (this.mmsList.length === 0 && this.textValue === common.string.EMPTY_STR) { 989 globalThis.needToUpdate = true; 990 this.deleteMessageById(this.threadId); 991 router.back(); 992 } else { 993 this.updateSessionLock(false); 994 this.updateLastItemContent(); 995 } 996 } 997 // After the deletion is complete, check whether all data is deleted. 998 } 999 1000 deleteMessageByGroupIds(groupIds): void { 1001 let actionData: LooseObject = {}; 1002 if (groupIds.length == 1) { 1003 actionData.groupId = groupIds[0]; 1004 } else { 1005 actionData.groupIds = groupIds; 1006 } 1007 // Invoke the database deletion method. 1008 ConversationService.getInstance().deleteSmsMmsInfoByCondition(actionData, null, null); 1009 } 1010 1011 // Updates the lock status of the session list. 1012 updateSessionLock(isLock) { 1013 let threadIds = [this.threadId]; 1014 let hasLock = isLock ? 1 : 0; 1015 let valueBucket = { 1016 'has_lock': hasLock, 1017 } 1018 if (!isLock) { 1019 // If you want to unlock the status, you must unlock all the statuses before unlocking the statuses. 1020 let unlockCount = 0; 1021 for (let element of this.mmsList) { 1022 if (!element.isLock) { 1023 unlockCount++; 1024 } 1025 } 1026 if (unlockCount != this.mmsList.length) { 1027 HiLog.w(TAG, 'updateSessionLock, it is not all select unlock'); 1028 return; 1029 } 1030 } 1031 let condition: LooseObject = {}; 1032 condition.threadId = this.threadId; 1033 ConversationListService.getInstance().updateSessionByCondition(condition, valueBucket, null, null); 1034 } 1035 1036 updateLastItemContent() { 1037 let actionData: LooseObject = { 1038 'mmsList': this.mmsList, 1039 'threadId': this.threadId, 1040 }; 1041 ConversationListService.getInstance().updateLastItemContent(actionData, null, null); 1042 } 1043 1044 deleteMessageById(threadId) { 1045 let threadIds = [threadId]; 1046 // Deleting Database Data 1047 let actionData = { 1048 threadIds: threadIds, 1049 }; 1050 ConversationListService.getInstance().deleteMessageById(actionData, null, null); 1051 } 1052 1053 clickGroupDelete() { 1054 if (this.selectDeleteMsgCount == 0) { 1055 return; 1056 } 1057 if (this.selectDeleteMsgCount == 1) { 1058 this.strMsgDeleteDialogTip = $r('app.string.msg_delete_dialog_con_tip1'); 1059 } else if (this.selectDeleteMsgCount == this.mmsList.length) { 1060 this.strMsgDeleteDialogTip = $r('app.string.msg_delete_dialog_con_tip3'); 1061 } else { 1062 this.strMsgDeleteDialogTip = $r('app.string.msg_delete_dialog_con_tip2', this.selectDeleteMsgCount); 1063 } 1064 this.hasLockMsg = (this.mmsList.some((element, index) => element.isCbChecked && element.isLock)); 1065 } 1066 1067 // Check whether a contact exists. 1068 judgeContactExists() { 1069 let actionData: LooseObject = {}; 1070 actionData.telephones = [this.strContactsNumber]; 1071 ContactsService.getInstance().judgeContactExist(actionData, result => { 1072 this.hasExitContact = result; 1073 }, globalThis.mmsContext); 1074 if (this.strContactsName == common.string.EMPTY_STR) { 1075 this.hasExitContact = false; 1076 } else { 1077 this.hasExitContact = true; 1078 } 1079 } 1080 1081 /** 1082 * Obtain information details. 1083 * 1084 * @param telephone 1085 * @param threadId 1086 * @param callback 1087 */ 1088 queryMessageDetail(telephone, threadId, callback) { 1089 let actionData: LooseObject = {}; 1090 if (telephone != common.string.EMPTY_STR) { 1091 actionData.telephone = telephone; 1092 } 1093 if (threadId != common.string.EMPTY_STR) { 1094 actionData.threadId = threadId; 1095 } 1096 actionData.contactsNum = this.contactsNum; 1097 ConversationService.getInstance().queryMessageDetail(actionData, result => { 1098 if (result.code == common.int.SUCCESS) { 1099 this.initIsShowMsgLongMenu(result); 1100 this.dealMessageDetailTime(result); 1101 this.dealMessageDetailContent(result); 1102 if (this.mmsList.length == 0 && this.isDraft) { 1103 HiLog.i(TAG, 'queryMessageDetail, isNewMsg = true'); 1104 this.isNewMsg = true; 1105 } 1106 } else { 1107 HiLog.w(TAG, 'queryMessageDetail, failed'); 1108 } 1109 if (this.isDraft) { 1110 this.setDraft(); 1111 } 1112 this.deleteDraftData(); 1113 }, null); 1114 if (callback) { 1115 callback(); 1116 } 1117 } 1118 1119 initIsShowMsgLongMenu(result) { 1120 for (let item of result.response) { 1121 item.isShowMsgLongMenu = false; 1122 } 1123 } 1124 1125 dealItemContent(showType, content, mmsSource) { 1126 let strContent = content; 1127 if (showType == common.MESSAGE_SHOW_TYPE.THEME_NO_IMAGE || showType == common.MESSAGE_SHOW_TYPE.THEME_IMAGE) { 1128 if (content !== common.string.EMPTY_STR) { 1129 strContent = $r('app.string.msg_theme') + ': ' + content; 1130 } 1131 } else if (showType == common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE) { 1132 strContent = (content == common.string.EMPTY_STR) ? $r('app.string.msg_slide') : content; 1133 } else if (showType == common.MESSAGE_SHOW_TYPE.PPT_IMAGE) { 1134 if (mmsSource[0].msgType == common.MSG_ITEM_TYPE.THEME && content !== common.string.EMPTY_STR) { 1135 strContent = $r('app.string.msg_theme') + ': ' + content; 1136 } else { 1137 strContent = (content == common.string.EMPTY_STR) ? $r('app.string.msg_slide') : content; 1138 } 1139 } 1140 return strContent; 1141 } 1142 1143 dealMessageDetailContent(result) { 1144 for (let item of result.response) { 1145 item.content = this.dealItemContent(item.msgShowType, item.content, item.mms); 1146 } 1147 } 1148 1149 dealMessageDetailTime(result) { 1150 if (result.response && result.response.length > 0) { 1151 let resultList = []; 1152 for (let item of result.response) { 1153 item.timeMillisecond = parseInt(item.timeMillisecond); 1154 dateUtil.fullDate(item); 1155 dateUtil.convertTimeStampToDateWeek(item, false); 1156 this.setDateShow(item, resultList); 1157 dateUtil.convertDateFormatForItem(item, false); 1158 if (item.sendStatus == common.int.SEND_DRAFT) { 1159 this.dealDraftData(item); 1160 } else { 1161 resultList.push(item); 1162 } 1163 } 1164 this.mmsList = resultList; 1165 } 1166 } 1167 1168 deleteDraftData() { 1169 if (this.isDraft && this.draftGroupId > 0) { 1170 let groupIds = [this.draftGroupId]; 1171 this.deleteMessageByGroupIds(groupIds); 1172 this.draftGroupId = 0; 1173 } 1174 } 1175 1176 getMmsDataSource(mmsSource, first) { 1177 this.pptTotalCount = (first.msgType == common.MSG_ITEM_TYPE.THEME) ? -1 : 0; 1178 let mms = []; 1179 let textareas = []; 1180 mmsSource.forEach((source, index) => { 1181 this.pptTotalCount++; 1182 let mmsObj = null; 1183 if (source.msgType == common.MSG_ITEM_TYPE.AUDIO || 1184 source.msgType == common.MSG_ITEM_TYPE.IMAGE || 1185 source.msgType == common.MSG_ITEM_TYPE.VIDEO) { 1186 mmsObj = { 1187 type: source.msgType, 1188 uriPath: source.msgUriPath, 1189 time: source.time, 1190 index: this.pptTotalCount, 1191 fileSize: first.fileSize 1192 }; 1193 mms.push(mmsObj); 1194 } 1195 let placeholder = $r('app.string.enter_text'); 1196 if (source.msgType == common.MSG_ITEM_TYPE.THEME) { 1197 placeholder = $r('app.string.msg_theme'); 1198 } else if (mmsSource[0].msgType == common.MSG_ITEM_TYPE.THEME && mmsSource.length == 2) { 1199 if (mmsObj) { 1200 placeholder = $r('app.string.msg_note_mms2'); 1201 } else { 1202 placeholder = $r('app.string.msg_note_mms'); 1203 } 1204 this.pptTotalCount = 0; 1205 } 1206 let obj = { 1207 textValue: source.content, 1208 placeholder: placeholder, 1209 pptIndex: this.pptTotalCount, 1210 mms: mmsObj 1211 }; 1212 textareas.push(obj); 1213 }); 1214 this.mmsEditList = mms; 1215 this.textareaDatasource = textareas; 1216 } 1217 1218 setMmsDataSource(mmsSource) { 1219 this.mmsEditList = []; 1220 this.textareaDatasource = []; 1221 let first = mmsSource[0]; 1222 this.messageType = first.messageType; 1223 if (this.messageType == common.MESSAGE_TYPE.NORMAL) { 1224 let arr = []; 1225 mmsSource.forEach(item => { 1226 let obj = { 1227 type: item.msgType, 1228 uriPath: item.msgUriPath, 1229 time: item.time, 1230 fileSize: item.fileSize 1231 } 1232 arr.push(obj); 1233 }); 1234 this.mmsEditList = arr; 1235 } else { 1236 this.getMmsDataSource(mmsSource, first); 1237 } 1238 } 1239 1240 dealDraftData(item) { 1241 // this.isDraft = true; 1242 this.draftContent = item.content; 1243 this.draftGroupId = item.groupId; 1244 if (item.isMsm) { 1245 this.isEditMms = true; 1246 this.setMmsDataSource(item.mms); 1247 } else { 1248 this.messageType = common.MESSAGE_TYPE.NORMAL; 1249 } 1250 } 1251 1252 // Set Draft Content 1253 setDraft() { 1254 // If the content is a draft, the draft content needs to be displayed. 1255 if (this.isDraft) { 1256 this.textValue = this.draftContent; 1257 this.canSendMessage = MmsPreferences.getInstance().haveSimCardReady(); 1258 } 1259 } 1260 1261 updateDetail(threadId, sendResult) { 1262 let sendResults: Array<LooseObject> = []; 1263 sendResults.push(sendResult); 1264 let actionData: LooseObject = {}; 1265 actionData.sendResults = sendResults; 1266 actionData.threadId = threadId; 1267 ConversationService.getInstance().updateSessionAndDetail(actionData); 1268 let sendStatus: number = sendResult.sendStatus; 1269 let deliveryReportSwitch: string = MmsPreferences.getInstance().getValueOfDeliveryReportSwitch(); 1270 HiLog.i(TAG, 'updateDetail, sendStatus=' + sendStatus + ', deliveryReportSwitch=' + deliveryReportSwitch); 1271 if ((deliveryReportSwitch == common.DELIVERY_REPORTS.SMS_AND_MMS || 1272 deliveryReportSwitch == common.DELIVERY_REPORTS.SMS) && sendStatus == common.int.SEND_MESSAGE_SUCCESS) { 1273 let msg: string = this.strContactsNumber + ' 已收到消息!' 1274 this.showToast(msg) 1275 } 1276 } 1277 1278 showToast(msg) { 1279 Prompt.showToast({ 1280 message: msg, 1281 duration: 2000, 1282 }); 1283 } 1284 1285 // Setting the Sending Status 1286 setCanSendMsgStatus() { 1287 if (this.receiveContactValue == common.string.EMPTY_STR && this.selectContacts.length == 0) { 1288 this.canSendMessage = false; 1289 } 1290 } 1291 1292 // Obtains the size of the current MMS file. 1293 getCurEdtFileSize() { 1294 this.curEdtFileSize = 0; 1295 if (!this.isEditMms || this.mmsEditList.length == 0) { 1296 return; 1297 } 1298 for (let element of this.mmsEditList) { 1299 this.curEdtFileSize += element.fileSize; 1300 } 1301 } 1302 1303 dealMmsSendResult(sendNumber, item, sendResult) { 1304 HiLog.i(TAG, 'dealMmsSendResult, start') 1305 // MMS Sending 1306 sendResult.sendStatus = common.int.SEND_MESSAGE_SUCCESS; 1307 item.sendStatus = common.int.SEND_MESSAGE_SUCCESS; 1308 this.updateDetail(this.threadId, sendResult); 1309 // The MMS message will be sent for receiving and using. 1310 if (sendNumber.length == 1 && sendResult.sendStatus == common.int.SEND_MESSAGE_SUCCESS) { 1311 setTimeout(() => { 1312 // this.publishData(sendResult.telephone, item.mmsSource); 1313 }, 1000); 1314 } 1315 let params = { 1316 mmsSource: item.mmsSource 1317 }; 1318 sendMsgService.sendMmsMessage(params, (sendStatus) => { 1319 }); 1320 } 1321 1322 dealSmsSendResult(params, item, sendResult) { 1323 sendMsgService.sendMessage(params, (sendStatus) => { 1324 HiLog.i(TAG, 'dealSmsSendResult, sendMessage sendStatus: ' + sendStatus); 1325 item.sendStatus = sendStatus; 1326 if (sendStatus === common.int.SEND_MESSAGE_FAILED) { 1327 item.failuresNumber = item.failuresNumber + 1; 1328 } 1329 item.completeNumber = item.completeNumber + 1; 1330 sendResult.sendStatus = sendStatus; 1331 // Update sending status 1332 this.updateDetail(this.threadId, sendResult); 1333 this.refresh = !this.refresh 1334 }); 1335 } 1336 1337 getSendMessageId(initDatas, telephone): number { 1338 for (let initData of initDatas) { 1339 if (initData == undefined || initData == null) { 1340 return; 1341 } 1342 if (initData.telephone == telephone) { 1343 try { 1344 if (initData.id == undefined || initData.id == null) { 1345 return; 1346 } 1347 } catch (err) { 1348 HiLog.e(TAG, 'this initData.id is undefined ' + JSON.stringify(err)); 1349 } 1350 return initData.id; 1351 } 1352 } 1353 } 1354 1355 convertingSms() { 1356 // Convert to SMS 1357 this.isEditMms = false; 1358 this.showToast($r('app.string.converting_sms')); 1359 } 1360 1361 dealSendResult(actionData, item, initDatas) { 1362 HiLog.i(TAG, 'dealSendResult, start') 1363 // Add sending information to the list. 1364 let sendNumbers: Array<string> = actionData.hosts; 1365 let content: string = actionData.content; 1366 for (let i = 0; i < sendNumbers.length; i++) { 1367 let params: LooseObject = { 1368 'slotId': actionData.slotId, 1369 'destinationHost': sendNumbers[i], 1370 'content': content, 1371 }; 1372 let id: number; 1373 try { 1374 id = this.getSendMessageId(initDatas, sendNumbers[i]); 1375 } catch (err) { 1376 HiLog.e(TAG, 'this initData.id is undefined ' + JSON.stringify(err)); 1377 } 1378 if (id == undefined || id == null) { 1379 return; 1380 } 1381 let sendResult: LooseObject = { 1382 'id': id, 1383 'telephone': sendNumbers[i], 1384 'content': content, 1385 } 1386 if (!item.isMsm) { 1387 this.dealSmsSendResult(params, item, sendResult); 1388 } else { 1389 this.dealMmsSendResult(sendNumbers, item, sendResult); 1390 } 1391 } 1392 } 1393 1394 insertInitData(actionData, item, callback): void { 1395 let sendNumbers: Array<string> = actionData.hosts; 1396 let insertSendResults: Array<LooseObject> = []; 1397 for (let i = 0; i < sendNumbers.length; i++) { 1398 let sendResult: LooseObject = { 1399 'slotId': actionData.slotId, 1400 'telephone': sendNumbers[i], 1401 'content': actionData.content, 1402 'sendStatus': common.int.SEND_MESSAGE_SENDING 1403 } 1404 if (item.isMsm) { 1405 sendResult.content = commonService.getMmsContent(item.mmsSource); 1406 } 1407 insertSendResults.push(sendResult); 1408 } 1409 let actionData_: LooseObject = {}; 1410 actionData_.sendResults = insertSendResults; 1411 actionData_.isReceive = false; 1412 actionData_.ownNumber = common.string.EMPTY_STR; 1413 actionData_.isSender = common.is_sender.NO; 1414 actionData_.hasDraft = this.isDraft; 1415 actionData_.hasReport = settingService.judgeIsDeliveryReport(item.isMsm) ? 1 : 0; 1416 actionData_.isMms = item.isMsm; 1417 actionData_.mmsSource = item.mmsSource; 1418 actionData_.hasAttachment = commonService.judgeIsAttachment(item.mmsSource); 1419 ConversationService.getInstance().insertSessionAndDetail(actionData_, callback, globalThis.mmsContext); 1420 } 1421 1422 changeReceiveContactValue(value) { 1423 this.receiveContactValue = value 1424 } 1425 1426 updatePreview(idx) { 1427 // Delete Preview 1428 HiLog.i(TAG, 'updatePreview, idx: ' + idx); 1429 // If not audio (picture or video) is deleted from the preview, you need to change the value of 1430 // checkbox in the thumbnail of the gallery. 1431 if (this.mmsEditList[idx].type != common.MSG_ITEM_TYPE.AUDIO) { 1432 let that = this; 1433 this.pictureListFromGallery.forEach(function (item) { 1434 if (item.path == that.mmsEditList[idx].uriPath) { 1435 item.checkedValue = false; 1436 that.curEdtFileSize -= that.mmsEditList[idx].fileSize; 1437 that.msgSendTip = Math.ceil(that.curEdtFileSize) + COMMON_FILE_SIZE_STRING; 1438 } 1439 }); 1440 } 1441 this.isOnlyAudio = !this.mmsEditList.some((item, index) => item.type != common.MSG_ITEM_TYPE.AUDIO); 1442 if (this.mmsEditList.length == 0) { 1443 this.convertingSms(); 1444 } 1445 } 1446 1447 initSendItem() { 1448 // Obtains the day of the week. 1449 HiLog.i(TAG, 'initSendItem, start') 1450 let item: LooseObject = {}; 1451 item.date = common.string.EMPTY_STR; 1452 item.time = $r('app.string.justNow'); 1453 item.timeMillisecond = new Date().getTime(); 1454 dateUtil.convertTimeStampToDateWeek(item, false); 1455 dateUtil.fullDate(item); 1456 item.content = this.textValue; 1457 item.msgType = this.mmsEditList.length != 0 ? this.mmsEditList[0].type : common.MSG_ITEM_TYPE.TEXT; 1458 item.isFullScreenImg = false; 1459 item.msgUriPath = this.mmsEditList.length != 0 ? this.mmsEditList[0].uriPath : common.string.EMPTY_STR; 1460 let time = (this.mmsEditList.length != 0 && (this.mmsEditList[0].type == 3 || this.mmsEditList[0].type == 5)) ? 1461 this.mmsEditList[0].time : common.string.SUCCESS; 1462 item.audioTime = time; 1463 item.isCbChecked = false; 1464 item.isLock = false; 1465 item.isStared = false; 1466 item.isReceive = false; 1467 item.sendStatus = 1; 1468 item.cancelTimeCount = common.int.CANCEL_TIME_COUNT; 1469 item.subId = this.slotId; 1470 item.mmsEditListTemp = this.mmsEditList; 1471 if (this.contactsNum > 1) { 1472 item.completeNumber = 0; 1473 item.failuresNumber = 0; 1474 } 1475 item.hasReport = settingService.judgeIsDeliveryReport(item.isMsm); 1476 item.msgShowType = this.getMsgShowType(item); 1477 item.mmsSource = this.getMmsSource(); 1478 item.isMsm = this.isEditMms; 1479 this.setDateShow(item, this.mmsList); 1480 this.mmsList.push(item); 1481 this.refresh = !this.refresh 1482 } 1483 1484 // Check whether the time on the top of each SMS message is displayed. 1485 setDateShow(item, list) { 1486 if (item == undefined || list == undefined) { 1487 return; 1488 } 1489 item.dateShow = true; 1490 if (item.date == undefined || item.date == null) { 1491 return; 1492 } 1493 if (item.date.id == undefined || item.date.id == null) { 1494 return; 1495 } 1496 let tempDateId = item.date?.id; 1497 if (item.week == undefined || item.week == null) { 1498 return; 1499 } 1500 if (item.week.id == undefined || item.week.id == null) { 1501 return; 1502 } 1503 let tempWeekId = item.week?.id; 1504 if (list.length > 0) { 1505 item.dateShow = 1506 (tempDateId != (list[list.length-1]).date?.id) 1507 && (tempWeekId != (list[list.length-1]).week?.id) 1508 } 1509 } 1510 1511 getMmsSource() { 1512 HiLog.i(TAG, 'getMmsSource, start') 1513 let sources = []; 1514 this.dealTextareaDataSource(); 1515 if (this.messageType === common.MESSAGE_TYPE.NORMAL) { 1516 sources = this.dealMmsEditList(); 1517 } else { 1518 sources = this.getMmsSourceFromDataSource(); 1519 } 1520 return sources; 1521 } 1522 1523 dealTextareaDataSource() { 1524 HiLog.i(TAG, 'dealTextareaDataSource, start') 1525 if (this.messageType == common.MESSAGE_TYPE.THEME) { 1526 let first = this.textareaDatasource[0]; 1527 if (first.textValue == common.string.EMPTY_STR) { 1528 this.messageType = common.MESSAGE_TYPE.NORMAL; 1529 this.textValue = this.textareaDatasource[1].textValue; 1530 this.textareaDatasource = []; 1531 } 1532 } 1533 } 1534 1535 dealMmsEditList() { 1536 HiLog.i(TAG, 'dealMmsEditList, start') 1537 let sources = []; 1538 if (this.mmsEditList.length != 0) { 1539 this.mmsEditList.forEach((item, index) => { 1540 let mms = { 1541 msgType: item.type, 1542 msgUriPath: item.uriPath, 1543 content: common.string.EMPTY_STR, 1544 time: item.time, 1545 fileSize: item.fileSize 1546 } 1547 if (index === 0) { 1548 mms.content = this.textValue; 1549 } 1550 sources.push(mms); 1551 }); 1552 } 1553 return sources; 1554 } 1555 1556 getMmsSourceFromDataSource() { 1557 HiLog.i(TAG, 'getMmsSourceFromDataSource, start') 1558 let sources = []; 1559 this.textareaDatasource.forEach((item, index) => { 1560 let mms = { 1561 msgType: common.MSG_ITEM_TYPE.TEXT, 1562 msgUriPath: '', 1563 content: item.textValue, 1564 time: '', 1565 fileSize: 0 1566 }; 1567 if (index === 0 && (this.messageType === common.MESSAGE_TYPE.THEME || 1568 this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT)) { 1569 mms.msgType = common.MSG_ITEM_TYPE.THEME; 1570 sources.push(mms); 1571 } else if (this.messageType === common.MESSAGE_TYPE.THEME) { 1572 sources.push(mms); 1573 sources = this.getMmsSourceByTheme(sources, item, mms); 1574 } else { 1575 if (item.mms) { 1576 mms.msgType = item.mms.type; 1577 mms.msgUriPath = item.mms.uriPath; 1578 mms.time = item.mms.time; 1579 mms.fileSize = item.mms.fileSize; 1580 } 1581 sources.push(mms); 1582 } 1583 }); 1584 return sources; 1585 } 1586 1587 getMmsSourceByTheme(sources, item, mms) { 1588 HiLog.i(TAG, 'getMmsSourceByTheme, start') 1589 if (this.mmsEditList.length === 1) { 1590 let first = this.mmsEditList[0]; 1591 sources.unshift({ 1592 msgType: first.type, 1593 msgUriPath: first.uriPath, 1594 content: item.textValue, 1595 time: first.time, 1596 fileSize: first.fileSize 1597 }); 1598 } else { 1599 this.getMmsSourceByItem(sources, mms); 1600 } 1601 let arr = JSON.parse(JSON.stringify(sources)); 1602 return arr; 1603 } 1604 1605 getMmsSourceByItem(sources, mms) { 1606 HiLog.i(TAG, 'getMmsSourceByItem, start') 1607 this.mmsEditList.forEach((list, i) => { 1608 if (i === 0) { 1609 mms.msgType = list.type; 1610 mms.msgUriPath = list.uriPath; 1611 mms.time = list.time; 1612 mms.fileSize = list.fileSize; 1613 } else { 1614 let mmsObj = { 1615 msgType: list.type, 1616 msgUriPath: list.uriPath, 1617 content: common.string.EMPTY_STR, 1618 time: list.time, 1619 fileSize: list.fileSize 1620 }; 1621 sources.push(mmsObj); 1622 } 1623 }); 1624 } 1625 1626 getMsgShowType(item) { 1627 HiLog.i(TAG, 'getMsgShowType, start') 1628 let type = common.MESSAGE_SHOW_TYPE.NORMAL; 1629 let slideString = 'msg_slide'; 1630 if (this.messageType === common.MESSAGE_TYPE.NORMAL && this.mmsEditList.length <= 1) { 1631 type = common.MESSAGE_SHOW_TYPE.NORMAL; 1632 item.content = this.textValue; 1633 } else if (this.messageType === common.MESSAGE_TYPE.THEME && this.mmsEditList.length === 1) { 1634 type = common.MESSAGE_SHOW_TYPE.THEME_IMAGE; 1635 item.content = this.getThemeContent(); 1636 } else { 1637 type = this.getMsgShowTypePpt(item, slideString); 1638 } 1639 if (type == common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE || type == common.MESSAGE_SHOW_TYPE.PPT_IMAGE) { 1640 if (item.content == common.string.EMPTY_STR) { 1641 item.content = slideString; 1642 } 1643 } 1644 return type; 1645 } 1646 1647 getMsgShowTypePpt(item, slideString) { 1648 HiLog.i(TAG, 'getMsgShowTypePpt, start') 1649 let type = common.MESSAGE_SHOW_TYPE.NORMAL; 1650 let hasSource = this.textareaDatasource.length > 0 ? true : false; 1651 let firstStr = hasSource ? this.textareaDatasource[0].textValue : common.string.EMPTY_STR; 1652 if (this.mmsEditList.length === 0) { 1653 type = common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE; 1654 if (this.messageType === common.MESSAGE_TYPE.THEME || 1655 this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT) { 1656 item.content = this.getThemeContent(); 1657 } else { 1658 item.content = (firstStr == common.string.EMPTY_STR) ? slideString : firstStr; 1659 } 1660 } else { 1661 type = this.getPPTType(); 1662 this.getMsgShowTypeContent(item, firstStr, slideString); 1663 } 1664 return type; 1665 } 1666 1667 getPPTType() { 1668 HiLog.i(TAG, 'getPPTType, start') 1669 let type = common.MESSAGE_SHOW_TYPE.NORMAL; 1670 if (this.messageType === common.MESSAGE_TYPE.NORMAL && this.mmsEditList.length > 0) { 1671 type = common.MESSAGE_SHOW_TYPE.PPT_IMAGE; 1672 } else { 1673 let firstMms = null; 1674 if (this.messageType === common.MESSAGE_TYPE.THEME && this.mmsEditList.length > 1) { 1675 firstMms = this.mmsEditList[0]; 1676 } else if (this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT) { 1677 firstMms = this.textareaDatasource[1].mms; 1678 } else { 1679 firstMms = this.textareaDatasource[0].mms; 1680 } 1681 if (this.mmsEditList.length >= 1 && firstMms && 1682 (firstMms.type === common.MSG_ITEM_TYPE.IMAGE || firstMms.type === common.MSG_ITEM_TYPE.VIDEO)) { 1683 type = common.MESSAGE_SHOW_TYPE.PPT_IMAGE; 1684 } else { 1685 type = common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE; 1686 } 1687 } 1688 return type; 1689 } 1690 1691 getMsgShowTypeContent(item, firstStr, slideString) { 1692 HiLog.i(TAG, 'getMsgShowTypeContent, start') 1693 if (this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT || 1694 this.messageType === common.MESSAGE_TYPE.THEME) { 1695 item.content = this.getThemeContent(); 1696 } else { 1697 let content = common.string.EMPTY_STR; 1698 if (this.messageType === common.MESSAGE_TYPE.NORMAL) { 1699 content = (this.textValue == common.string.EMPTY_STR) ? slideString : this.textValue; 1700 } else { 1701 content = (firstStr == common.string.EMPTY_STR) ? slideString : firstStr; 1702 } 1703 item.content = content; 1704 } 1705 } 1706 1707 getThemeContent() { 1708 HiLog.i(TAG, 'getThemeContent, start') 1709 this.isEditMms = true; 1710 let content = ''; 1711 let first = this.textareaDatasource[0].textValue; 1712 let text = this.textareaDatasource[1].textValue; 1713 if (first !== common.string.EMPTY_STR) { 1714 content = $r('app.string.msg_theme') + ': ' + first; 1715 } 1716 if (text !== common.string.EMPTY_STR) { 1717 if (content === common.string.EMPTY_STR) { 1718 content = text; 1719 } else { 1720 content = content + '\n' + text; 1721 } 1722 } 1723 return content; 1724 } 1725 1726 sendMassMessage(actionData, item) { 1727 this.insertInitData(actionData, item, result => { 1728 // Processing the sent result 1729 if (this.threadId != result.rowId) { 1730 // When modifying the recipient information, click Send and delete the session before the modification. 1731 let condition: LooseObject = {}; 1732 condition.threadId = this.threadId; 1733 ConversationListService.getInstance().deleteSessionByCondition(condition, null, null); 1734 } 1735 this.threadId = result.rowId; 1736 this.portraitColor = AvatarColor.background.Color[Math.abs(this.threadId) % 6]; 1737 item.groupId = result.groupId; 1738 if (result.initDatas[0] == undefined || result.initDatas[0] == null) { 1739 return; 1740 } 1741 if (result.initDatas[0].id == undefined || result.initDatas[0].id == null) { 1742 return; 1743 } 1744 item.id = result.initDatas[0].id; 1745 this.refresh = !this.refresh 1746 // Sending and processing the sending result 1747 this.dealSendResult(actionData, item, result.initDatas); 1748 }); 1749 } 1750 1751 clearMsm() { 1752 if (this.isEditMms) { 1753 this.isEditMms = false; 1754 } 1755 // Deleting the preview image of an MMS message 1756 if (this.mmsEditList.length != 0) { 1757 for (let index in this.mmsEditList) { 1758 this.updatePreview(index); 1759 } 1760 this.mmsEditList = []; 1761 } 1762 } 1763 1764 resetMmsSource() { 1765 this.textareaDatasource = []; 1766 this.mmsEditList = []; 1767 this.pptTotalCount = 0; 1768 this.messageType = common.MESSAGE_TYPE.NORMAL; 1769 this.selectedTextareaIdx = -1; 1770 } 1771 1772 send() { 1773 HiLog.i(TAG, 'send, start'); 1774 // The Send button is dimmed and messages cannot be sent. 1775 if (!this.canSendMessage) { 1776 HiLog.w(TAG, 'send, canSendMessage=false'); 1777 return; 1778 } 1779 // Switching from the new state to the session state 1780 if (this.isNewMsg) { 1781 HiLog.i(TAG, 'send, isNewMsg=true'); 1782 this.newSend(() => { 1783 this.sendDataRefresh(); 1784 }); 1785 } else { 1786 this.sendDataRefresh(); 1787 } 1788 } 1789 1790 sendDataRefresh() { 1791 this.isSendStatus = true; 1792 this.slotId = MmsPreferences.getInstance().getSendMessageSlotId(); 1793 if (this.textValue != common.string.EMPTY_STR || this.mmsEditList.length != 0 || 1794 this.textareaDatasource.length != 0) { 1795 this.initSendItem(); 1796 } 1797 let actionData: LooseObject = {}; 1798 actionData.slotId = this.slotId; 1799 actionData.destinationHost = this.strContactsNumber; 1800 actionData.content = this.textValue; 1801 actionData.isEditMms = this.isEditMms; 1802 // Real SMS Sending 1803 this.sendInterval(actionData, this.mmsList); 1804 this.textValue = common.string.EMPTY_STR; 1805 this.canSendMessage = false; 1806 this.isShowFullScreen = false; 1807 this.clearMsm(); 1808 this.resetMmsSource(); 1809 this.setTabOperationStatus(false); 1810 this.distanceBottomFlag = false; 1811 this.receiveContactValue = common.string.EMPTY_STR; 1812 this.selectContacts = []; 1813 this.isNewMsg = false; 1814 } 1815 1816 isPhoneNumber(str) { 1817 // Determine whether the value is a number. 1818 let reg = /^\d{1,}$/; 1819 let pattern = new RegExp(reg); 1820 return pattern.test(str); 1821 } 1822 1823 newSend(callback) { 1824 // Check whether the entered content has a value. 1825 if (this.receiveContactValue != common.string.EMPTY_STR) { 1826 if (!this.isPhoneNumber(this.receiveContactValue)) { 1827 // Invalid Recipient 1828 this.showToast($r('app.string.invalid_receive', this.receiveContactValue)) 1829 HiLog.w(TAG, 'newSend, PhoneNumber is invalidate'); 1830 return; 1831 } 1832 } 1833 if (this.selectContacts.length > 0 && this.receiveContactValue != common.string.EMPTY_STR) { 1834 let selectContact = { 1835 telephone: this.receiveContactValue, 1836 telephoneFormat: this.receiveContactValue, 1837 contactName: common.string.EMPTY_STR 1838 } 1839 let selectContacts = this.selectContacts; 1840 selectContacts.push(selectContact); 1841 this.initNewSelectContacts(selectContacts); 1842 } else if (this.selectContacts.length > 0) { 1843 this.initNewSelectContacts(this.selectContacts); 1844 } else if (this.receiveContactValue != common.string.EMPTY_STR) { 1845 this.contactsNum = 1; 1846 this.strContactsNumber = this.receiveContactValue; 1847 this.strContactsNumberFormat = this.receiveContactValue; 1848 } else { 1849 HiLog.w(TAG, 'newSend, the contact condition is not met.') 1850 return; 1851 } 1852 this.isNewMsg = false; 1853 // To cancel sending, set this parameter to true. 1854 if (this.recallMessagesFlag) { 1855 this.isNewRecallMessagesFlag = true; 1856 this.commonCtrl.paramContact.isNewRecallMessagesFlag = true; 1857 } 1858 // When the new page is displayed in full screen mode, the following table data needs to be obtained. 1859 if (true) { 1860 this.queryOldMessageList(this.strContactsNumber, callback); 1861 } 1862 } 1863 1864 queryOldMessageList(telephone, callback) { 1865 HiLog.i(TAG, 'queryOldMessageList, start'); 1866 if (telephone == common.string.EMPTY_STR) { 1867 return; 1868 } 1869 let number: string = telephoneUtil.dealTelephoneSort(telephone); 1870 ConversationListService.getInstance().querySessionByTelephone(number, res => { 1871 if (res.response == undefined || res.response == null) { 1872 return; 1873 } 1874 if (res.response.id == undefined || res.response.id == null) { 1875 return; 1876 } 1877 HiLog.i(TAG, 'queryOldMessageList, querySessionByTelephone res.response.id: ' + res.response.id); 1878 if (res.code == common.int.SUCCESS && res.response.id > 0) { 1879 if (this.threadId != res.response.id) { 1880 // When modifying the recipient information, click Send and delete the session before the 1881 // modification. 1882 let condition: LooseObject = {}; 1883 condition.threadId = this.threadId; 1884 ConversationListService.getInstance().deleteSessionByCondition(condition, null, null); 1885 } 1886 this.isDraft = res.response.hasDraft; 1887 this.threadId = res.response.id; 1888 this.portraitColor = AvatarColor.background.Color[Math.abs(this.threadId) % 6]; 1889 this.queryMessageDetail(telephone, res.response.id, callback); 1890 this.scroller.scrollToIndex(this.mmsList.length - 1); 1891 } else { 1892 callback(); 1893 } 1894 }, null); 1895 } 1896 1897 initNewSelectContacts(selectContacts) { 1898 HiLog.i(TAG, 'initNewSelectContacts, start'); 1899 let contactsNumber = common.string.EMPTY_STR; 1900 let contactsName = common.string.EMPTY_STR; 1901 let contactsNumberFormat = common.string.EMPTY_STR; 1902 let contacts = telephoneUtil.dealSelectContactsSort(selectContacts); 1903 let length = contacts.length; 1904 for (let index in contacts) { 1905 let item = contacts[index]; 1906 contactsNumber = contactsNumber + item.telephone + common.string.COMMA; 1907 contactsNumberFormat = contactsNumberFormat + item.telephoneFormat + common.string.COMMA; 1908 if (item.contactName != common.string.EMPTY_STR) { 1909 contactsName += (item.contactName + common.string.COMMA); 1910 } 1911 } 1912 this.strContactsNumber = contactsNumber.substring(0, contactsNumber.length - 1); 1913 this.strContactsName = contactsName.substring(0, contactsName.length - 1); 1914 this.photoFirstNameDeal(this.strContactsName); 1915 this.strContactsNumberFormat = contactsNumberFormat.substring(0, contactsNumberFormat.length - 1); 1916 this.contactsNum = length; 1917 } 1918 1919 handleWithSend(actionData, item) { 1920 // Sending request processing 1921 let hosts: Array<string> = []; 1922 if (actionData.destinationHost.indexOf(',') == -1) { 1923 // single-shot 1924 hosts.push(actionData.destinationHost); 1925 } else { 1926 // Group Sending 1927 for (let host of actionData.destinationHost.split(',')) { 1928 hosts.push(telephoneUtil.formatTelephone(host)); 1929 } 1930 } 1931 actionData.hosts = hosts; 1932 this.sendMassMessage(actionData, item); 1933 } 1934 1935 sendInterval(actionData, mmsList) { 1936 // Send Timer 1937 let item = mmsList[mmsList.length - 1]; 1938 if (this.recallMessagesFlag) { 1939 item.intervalSendStatus = true; 1940 // Second countdown timer after the Send button is clicked 1941 item.sendIntervalId = setInterval(function () { 1942 item.cancelTimeCount--; 1943 }, 1000); 1944 // Transmit timer, which is sent after 6s. 1945 item.sendTimeoutId = setTimeout(() => { 1946 item.cancelTimeCount = 0; 1947 // Clear Timer 1948 clearTimeout(item.sendTimeoutId); 1949 clearInterval(item.sendIntervalId); 1950 this.handleWithSend(actionData, item); 1951 }, 6000); 1952 } else { 1953 this.handleWithSend(actionData, item); 1954 } 1955 } 1956 1957 changeValue(e) { 1958 this.textValue = e; 1959 if (e == null || e == common.string.EMPTY_STR) { 1960 if (this.mmsEditList.length != 0) { 1961 this.canSendMessage = true; 1962 } else { 1963 this.canSendMessage = false; 1964 } 1965 return; 1966 } 1967 // Whether to display full screen 1968 if (this.isEditMms) { 1969 this.isShowFullScreen = false; 1970 } else { 1971 this.isShowFullScreen = true; 1972 } 1973 if (this.isNewMsg) { 1974 if (this.receiveContactValue == '' && this.selectContacts.length == 0) { 1975 this.canSendMessage = false; 1976 return; 1977 } 1978 } 1979 if (this.textValue.length == 0) { 1980 this.canSendMessage = false; 1981 return; 1982 } else { 1983 this.canSendMessage = MmsPreferences.getInstance().haveSimCardReady() && !this.isFlightMode; 1984 } 1985 if (this.isNewMsg) { 1986 this.setCanSendMsgStatus(); 1987 } 1988 } 1989 1990 setTabTitleText() { 1991 // TabTitleText selected globally 1992 if (this.tabIndex != 1) { 1993 // Non-picture page 1994 this.tabTitleText = this.tabTextList[this.tabIndex]; 1995 return; 1996 } 1997 // On the image selection page, the number of selected images is displayed. 1998 let size = 0; 1999 for (let element of this.pictureListFromGallery) { 2000 if (element.checkedValue) { 2001 size++; 2002 } 2003 } 2004 this.tabTitleText = size == 0 ? $r('app.string.msg_unselected_tip') : $r('app.string.msg_selected_tip', { 2005 number: size 2006 }); 2007 } 2008 2009 // Check whether the sending icon can be highlighted. 2010 judgeSendBtnCanClicked() { 2011 if (MmsPreferences.getInstance().haveSimCardReady() && (this.mmsEditList.length != 0 || 2012 this.textValue != common.string.EMPTY_STR || this.textareaDatasource.length !== 0)) { 2013 if (this.isNewMsg) { 2014 if ((this.receiveContactValue !== '' && this.isPhoneNumber(this.receiveContactValue)) 2015 || this.selectContacts.length !== 0) { 2016 this.canSendMessage = true; 2017 } 2018 } else { 2019 this.canSendMessage = true; 2020 } 2021 } 2022 } 2023 2024 // Subscribing to Public Events 2025 subscribeDetail() { 2026 HiLog.i(TAG, 'subscribeDetail, start'); 2027 let events = [common.string.RECEIVE_TRANSMIT_EVENT] 2028 let commonEventSubscribeInfo = { 2029 events: events 2030 }; 2031 // Creating Subscription Information 2032 commonEvent.createSubscriber(commonEventSubscribeInfo, this.createSubscriberCallBack.bind(this)); 2033 } 2034 2035 createSubscriberCallBack(err, data) { 2036 this.commonEventData = data; 2037 // Received subscription 2038 commonEvent.subscribe(this.commonEventData, this.subscriberCallBack.bind(this)); 2039 } 2040 2041 subscriberCallBack(err, data) { 2042 HiLog.i(TAG, 'subscriberCallBack, start'); 2043 globalThis.needToUpdate = true; 2044 // Receiving SMS Updates 2045 this.queryMessageDetail(this.strContactsNumber, this.threadId, () => { 2046 }); 2047 setTimeout(() => { 2048 this.scroller.scrollToIndex(this.mmsList.length - 1); 2049 let actionData: LooseObject = {}; 2050 actionData.threadId = this.threadId; 2051 actionData.hasRead = common.is_read.UN_READ; 2052 NotificationService.getInstance().cancelMessageNotify(actionData); 2053 NotificationService.getInstance().updateBadgeNumber(); 2054 ConversationListService.getInstance().markAllToRead(actionData); 2055 let lastItem: LooseObject = this.mmsList[this.mmsList.length - 1]; 2056 if (lastItem != null && lastItem.subId != null) { 2057 this.notifySlotIdChange(lastItem.subId); 2058 } 2059 }, 500); 2060 } 2061 2062 // Unsubscribe 2063 unSubscribeDetail() { 2064 if (this.commonEventData != null) { 2065 commonEvent.unsubscribe(this.commonEventData, () => { 2066 HiLog.i(TAG, 'unSubscribeDetail, unsubscribe'); 2067 }); 2068 } 2069 } 2070 2071 notifySlotIdChange(slotId: number): void { 2072 if (MmsPreferences.getInstance().getSelectedSlotId() != slotId) { 2073 MmsPreferences.getInstance().setValueToMap(common.string.KEY_OF_SELECTED_SLOTID, slotId); 2074 HiLog.i(TAG, 'notifySlotIdChange, emit slotId: ' + slotId); 2075 emitter.emit(simCardService.SLOTID_CHANGE_EVENT, { 2076 data: { 2077 'slotId': slotId 2078 } 2079 }); 2080 } 2081 } 2082 2083 // In the selection mode, tap More. In the displayed menu, select 2084 moreSelected(e) { 2085 HiLog.i(TAG, 'moreSelected, e: ' + JSON.stringify(e)) 2086 switch (e) { 2087 case '0': 2088 // duplicating 2089 this.copyText(); 2090 break; 2091 case 1: 2092 // Share 2093 this.share(); 2094 break; 2095 case 2: 2096 // Select Text 2097 this.gotoTextSelect(this.mmsIndex); 2098 break; 2099 case 3: 2100 // lock 2101 //this.lock(); 2102 break; 2103 case 4: 2104 // Show Details 2105 this.showDetails(); 2106 break; 2107 case 5: 2108 // Unlock 2109 //this.unlock(); 2110 break; 2111 case 6: 2112 // View Reports 2113 this.showReport(this.mmsIndex); 2114 break; 2115 case 7: 2116 // Save Attachments 2117 this.saveImage(); 2118 break; 2119 case 8: 2120 // Querying vCard Details 2121 this.showVcarDetail(this.mmsIndex); 2122 break; 2123 default: 2124 break; 2125 } 2126 // Exit the multi-selection mode. 2127 this.exitMultiselect(); 2128 } 2129 2130 copyText() { 2131 commonPasteboard.setPasteboard(this.mmsList[this.mmsIndex].content); 2132 } 2133 2134 share() { 2135 for (let i = 0; i < this.mmsList.length; i++) { 2136 if (this.mmsList[i].isCbChecked == true) { 2137 let actionData: LooseObject = {}; 2138 actionData.content = this.mmsList[i].content; 2139 ConversationService.getInstance().gotoShare(actionData, null, null); 2140 } 2141 } 2142 } 2143 2144 gotoTextSelect(idx) { 2145 router.push({ 2146 uri: 'pages/text_select/text_select', 2147 params: this.mmsList[idx] 2148 }) 2149 } 2150 2151 showDetails() { 2152 for (let index = 0; index < this.mmsList.length; index++) { 2153 if (this.mmsList[index].isCbChecked == true) { 2154 var time = this.mmsList[index].timeMillisecond; 2155 var timeStash = this.getTime(time); 2156 this.mmsTime = timeStash + this.mmsList[index].time; 2157 if (this.mmsList[index].msgType == 0) { 2158 this.isMmsType = $r('app.string.sms'); 2159 } else { 2160 this.isMmsType = $r('app.string.mms'); 2161 } 2162 2163 if (this.mmsList[index].isReceive) { 2164 this.isSendRecipient = true; 2165 } else { 2166 this.isSendRecipient = false; 2167 } 2168 } 2169 } 2170 // this.$element('mms_details_dialog').show(); 2171 } 2172 2173 showReport(mmsIndex) { 2174 // View Reports 2175 let item = this.mmsList[mmsIndex]; 2176 router.push({ 2177 uri: 'pages/queryreport/queryReport', 2178 params: { 2179 isMsm: item.isMsm, 2180 telephone: this.strContactsNumber, 2181 sendStatus: item.sendStatus, 2182 timeMillisecond: item.timeMillisecond 2183 }, 2184 }); 2185 } 2186 2187 saveImage() { 2188 var actionData: LooseObject = {}; 2189 actionData.threadId = this.mmsList[this.mmsIndex]?.threadId; 2190 actionData.pduId = this.mmsList[this.mmsIndex]?.pduId; 2191 ConversationService.getInstance().saveImage(actionData, result => { 2192 this.showToast(result); 2193 }, null); 2194 } 2195 2196 showVcarDetail(mmsIndex) { 2197 2198 } 2199 2200 exitMultiselect() { 2201 // Exit the multi-selection state. 2202 this.isSelectStatus = false; 2203 this.cancelCheckedAll(); 2204 } 2205 2206 longPressMore(e) { 2207 switch (e) { 2208 case 0: 2209 // delete 2210 this.deleteDetail(); 2211 break; 2212 case 1: 2213 // New Contact 2214 this.createNewContact(this.strContactsNumber); 2215 break; 2216 case 2: 2217 // Save to Existing Contacts 2218 this.existingContact(this.strContactsNumber); 2219 break; 2220 case 3: 2221 // Edit Before Call 2222 this.callEditor(this.strContactsNumber); 2223 break; 2224 case 4: 2225 // Add to Blocklist 2226 this.callEditor(this.strContactsNumber); 2227 break; 2228 case 5: 2229 // View Contacts 2230 this.titleBarAvatar(); 2231 break; 2232 default: 2233 break; 2234 } 2235 } 2236 2237 // Delete 2238 deleteDetail() { 2239 if (this.mmsList.length == 1) { 2240 this.strMsgDeleteDialogTip = $r('app.string.msg_delete_dialog_con_tip3'); 2241 } else { 2242 this.hasDetailDelete = false; 2243 this.isSelectStatus = true; 2244 } 2245 } 2246 2247 // New Contact 2248 createNewContact(number) { 2249 var actionData: LooseObject = {}; 2250 actionData.phoneNumber = number; 2251 actionData.pageFlag = common.contactPage.PAGE_FLAG_SAVE_CONTACT; 2252 this.jumpToContact(actionData); 2253 } 2254 2255 // Edit Before Call 2256 callEditor(number) { 2257 var actionData: LooseObject = {}; 2258 actionData.phoneNumber = number; 2259 actionData.pageFlag = common.contactPage.PAGE_FLAG_EDIT_BEFORE_CALLING; 2260 this.jumpToContact(actionData); 2261 } 2262 2263 // Save to Existing Contacts 2264 existingContact(number) { 2265 var actionData: LooseObject = {}; 2266 actionData.phoneNumber = number; 2267 actionData.pageFlag = common.contactPage.PAGE_FLAG_SAVE_EXIST_CONTACT; 2268 this.jumpToContact(actionData); 2269 } 2270 2271 // Switching to the Contacts app 2272 jumpToContact(actionData) { 2273 let str = commonService.commonContactParam(actionData); 2274 globalThis.mmsContext.startAbility(str).then((data) => { 2275 HiLog.i(TAG, 'jumpToContact, startAbility Success'); 2276 }).catch((error) => { 2277 HiLog.e(TAG, 'jumpToContact, failed. Cause: ' + JSON.stringify(error.message)); 2278 }) 2279 } 2280 2281 // Tap a contact's avatar to go to the contact details page. 2282 titleBarAvatar() { 2283 var actionData = { 2284 phoneNumber: this.strContactsNumber, 2285 pageFlag: common.contactPage.PAGE_FLAG_CONTACT_DETAILS 2286 }; 2287 this.jumpToContact(actionData); 2288 } 2289 2290 clickCall() { 2291 this.call(this.strContactsNumber); 2292 } 2293 2294 call(telephone) { 2295 // Calling 2296 callService.call(telephone, result => { 2297 if (result.code == common.int.SUCCESS) { 2298 HiLog.i(TAG, 'call success'); 2299 } else { 2300 HiLog.w(TAG, 'call failed'); 2301 } 2302 }); 2303 } 2304 2305 getTime(nS) { 2306 var date = new Date(parseInt(nS)); 2307 var year = date.getFullYear(); 2308 var mon = date.getMonth() + 1; 2309 var day = date.getDate(); 2310 return year; // + $r('app.string.year') + mon + $r('app.string.month') + day + $r('app.string.day'); 2311 } 2312 2313 // Contact data returned on the new page 2314 setReceiveContactValue(receiverData) { 2315 let selectContacts = receiverData.selectContacts; 2316 let receiveContactValue = selectContacts.length > 0 ? common.string.EMPTY_STR : receiverData.contactValue; 2317 let hasBlur = receiverData.hasBlur; 2318 let telephone = common.string.EMPTY_STR; 2319 this.setCanSendMessage(selectContacts, receiveContactValue) 2320 if (receiveContactValue != this.strContactsName && router.getParams[0]?.isDraft == null) { 2321 this.isDraft = false; 2322 } 2323 if (hasBlur && receiveContactValue != common.string.EMPTY_STR) { 2324 let index = -1; 2325 for (let i = 0; i < selectContacts.length; i++) { 2326 let contact = selectContacts[i]; 2327 if (contact.telephone == receiveContactValue) { 2328 index = i; 2329 break; 2330 } 2331 } 2332 if (index >= 0) { 2333 selectContacts.splice(index, 1); 2334 } 2335 } 2336 if (receiveContactValue != common.string.EMPTY_STR) { 2337 this.receiveContactValue = receiveContactValue; 2338 } else { 2339 this.receiveContactValue = common.string.EMPTY_STR; 2340 } 2341 if (selectContacts.length > 0) { 2342 for (let item of selectContacts) { 2343 if (!this.isPhoneNumber(item.telephone)) { 2344 item.telephone = this.replaceCode(item.telephone); 2345 item.telephoneFormat = this.replaceCode(item.telephoneFormat); 2346 if (item.contactName != common.string.EMPTY_STR) { 2347 item.contactName = common.string.EMPTY_STR; 2348 } 2349 } 2350 if (this.selectContacts.length > 1) { 2351 break 2352 } 2353 this.selectContacts = selectContacts; 2354 } 2355 } else { 2356 this.selectContacts = []; 2357 } 2358 if (this.selectContacts.length > 0) { 2359 for (let element of this.selectContacts) { 2360 telephone += element.telephone + common.string.COMMA; 2361 } 2362 } 2363 if (this.receiveContactValue != common.string.EMPTY_STR) { 2364 telephone += this.receiveContactValue + common.string.COMMA; 2365 } 2366 if (telephone != common.string.EMPTY_STR) { 2367 telephone = telephone.substring(0, telephone.length - 1); 2368 } 2369 if (!hasBlur && telephone != '') { 2370 this.queryOldMessageList(telephone, () => { 2371 }); 2372 } 2373 } 2374 2375 setCanSendMessage(selectContacts, receiveContactValue) { 2376 if (this.textValue != common.string.EMPTY_STR || this.isEditMms) { 2377 if (this.canSendMessage) { 2378 if (selectContacts.length == 0 && receiveContactValue == common.string.EMPTY_STR) { 2379 this.canSendMessage = false; 2380 } 2381 } else if ((selectContacts.length != 0 || receiveContactValue != common.string.EMPTY_STR) 2382 && MmsPreferences.getInstance().haveSimCardReady()) { 2383 this.canSendMessage = true; 2384 } 2385 } 2386 } 2387}