• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}