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 = this.getSendMessageId(initDatas, sendNumbers[i]);
1373      if (id == undefined || id == null) {
1374        return;
1375      }
1376      let sendResult: LooseObject = {
1377        'id': id,
1378        'telephone': sendNumbers[i],
1379        'content': content,
1380      }
1381      if (!item.isMsm) {
1382        this.dealSmsSendResult(params, item, sendResult);
1383      } else {
1384        this.dealMmsSendResult(sendNumbers, item, sendResult);
1385      }
1386    }
1387  }
1388
1389  insertInitData(actionData, item, callback): void {
1390    let sendNumbers: Array<string> = actionData.hosts;
1391    let insertSendResults: Array<LooseObject> = [];
1392    for (let i = 0; i < sendNumbers.length; i++) {
1393      let sendResult: LooseObject = {
1394        'slotId': actionData.slotId,
1395        'telephone': sendNumbers[i],
1396        'content': actionData.content,
1397        'sendStatus': common.int.SEND_MESSAGE_SENDING
1398      }
1399      if (item.isMsm) {
1400        sendResult.content = commonService.getMmsContent(item.mmsSource);
1401      }
1402      insertSendResults.push(sendResult);
1403    }
1404    let actionData_: LooseObject = {};
1405    actionData_.sendResults = insertSendResults;
1406    actionData_.isReceive = false;
1407    actionData_.ownNumber = common.string.EMPTY_STR;
1408    actionData_.isSender = common.is_sender.NO;
1409    actionData_.hasDraft = this.isDraft;
1410    actionData_.hasReport = settingService.judgeIsDeliveryReport(item.isMsm) ? 1 : 0;
1411    actionData_.isMms = item.isMsm;
1412    actionData_.mmsSource = item.mmsSource;
1413    actionData_.hasAttachment = commonService.judgeIsAttachment(item.mmsSource);
1414    ConversationService.getInstance().insertSessionAndDetail(actionData_, callback, globalThis.mmsContext);
1415  }
1416
1417  changeReceiveContactValue(value) {
1418    this.receiveContactValue = value
1419  }
1420
1421  updatePreview(idx) {
1422    // Delete Preview
1423    HiLog.i(TAG, 'updatePreview, idx: ' + idx);
1424    // If not audio (picture or video) is deleted from the preview, you need to change the value of
1425    // checkbox in the thumbnail of the gallery.
1426    if (this.mmsEditList[idx].type != common.MSG_ITEM_TYPE.AUDIO) {
1427      let that = this;
1428      this.pictureListFromGallery.forEach(function (item) {
1429        if (item.path == that.mmsEditList[idx].uriPath) {
1430          item.checkedValue = false;
1431          that.curEdtFileSize -= that.mmsEditList[idx].fileSize;
1432          that.msgSendTip = Math.ceil(that.curEdtFileSize) + COMMON_FILE_SIZE_STRING;
1433        }
1434      });
1435    }
1436    this.isOnlyAudio = !this.mmsEditList.some((item, index) => item.type != common.MSG_ITEM_TYPE.AUDIO);
1437    if (this.mmsEditList.length == 0) {
1438      this.convertingSms();
1439    }
1440  }
1441
1442  initSendItem() {
1443    // Obtains the day of the week.
1444    HiLog.i(TAG, 'initSendItem, start')
1445    let item: LooseObject = {};
1446    item.date = common.string.EMPTY_STR;
1447    item.time = $r('app.string.justNow');
1448    item.timeMillisecond = new Date().getTime();
1449    dateUtil.convertTimeStampToDateWeek(item, false);
1450    dateUtil.fullDate(item);
1451    item.content = this.textValue;
1452    item.msgType = this.mmsEditList.length != 0 ? this.mmsEditList[0].type : common.MSG_ITEM_TYPE.TEXT;
1453    item.isFullScreenImg = false;
1454    item.msgUriPath = this.mmsEditList.length != 0 ? this.mmsEditList[0].uriPath : common.string.EMPTY_STR;
1455    let time = (this.mmsEditList.length != 0 && (this.mmsEditList[0].type == 3 || this.mmsEditList[0].type == 5)) ?
1456    this.mmsEditList[0].time : common.string.SUCCESS;
1457    item.audioTime = time;
1458    item.isCbChecked = false;
1459    item.isLock = false;
1460    item.isStared = false;
1461    item.isReceive = false;
1462    item.sendStatus = 1;
1463    item.cancelTimeCount = common.int.CANCEL_TIME_COUNT;
1464    item.subId = this.slotId;
1465    item.mmsEditListTemp = this.mmsEditList;
1466    if (this.contactsNum > 1) {
1467      item.completeNumber = 0;
1468      item.failuresNumber = 0;
1469    }
1470    item.hasReport = settingService.judgeIsDeliveryReport(item.isMsm);
1471    item.msgShowType = this.getMsgShowType(item);
1472    item.mmsSource = this.getMmsSource();
1473    item.isMsm = this.isEditMms;
1474    this.setDateShow(item, this.mmsList);
1475    this.mmsList.push(item);
1476    this.refresh = !this.refresh
1477  }
1478
1479  // Check whether the time on the top of each SMS message is displayed.
1480  setDateShow(item, list) {
1481    item.dateShow = true;
1482    if (item.date == undefined || item.date == null) {
1483      return;
1484    }
1485    if (item.date.id == undefined || item.date.id == null) {
1486      return;
1487    }
1488    let tempDateId = item.date?.id;
1489    if (item.week == undefined || item.week == null) {
1490      return;
1491    }
1492    if (item.week.id == undefined || item.week.id == null) {
1493      return;
1494    }
1495    let tempWeekId = item.week?.id;
1496    if (list.length > 0) {
1497      item.dateShow =
1498        (tempDateId != (list[list.length-1]).date.id)
1499          && (tempWeekId != (list[list.length-1]).week.id)
1500    }
1501  }
1502
1503  getMmsSource() {
1504    HiLog.i(TAG, 'getMmsSource, start')
1505    let sources = [];
1506    this.dealTextareaDataSource();
1507    if (this.messageType === common.MESSAGE_TYPE.NORMAL) {
1508      sources = this.dealMmsEditList();
1509    } else {
1510      sources = this.getMmsSourceFromDataSource();
1511    }
1512    return sources;
1513  }
1514
1515  dealTextareaDataSource() {
1516    HiLog.i(TAG, 'dealTextareaDataSource, start')
1517    if (this.messageType == common.MESSAGE_TYPE.THEME) {
1518      let first = this.textareaDatasource[0];
1519      if (first.textValue == common.string.EMPTY_STR) {
1520        this.messageType = common.MESSAGE_TYPE.NORMAL;
1521        this.textValue = this.textareaDatasource[1].textValue;
1522        this.textareaDatasource = [];
1523      }
1524    }
1525  }
1526
1527  dealMmsEditList() {
1528    HiLog.i(TAG, 'dealMmsEditList, start')
1529    let sources = [];
1530    if (this.mmsEditList.length != 0) {
1531      this.mmsEditList.forEach((item, index) => {
1532        let mms = {
1533          msgType: item.type,
1534          msgUriPath: item.uriPath,
1535          content: common.string.EMPTY_STR,
1536          time: item.time,
1537          fileSize: item.fileSize
1538        }
1539        if (index === 0) {
1540          mms.content = this.textValue;
1541        }
1542        sources.push(mms);
1543      });
1544    }
1545    return sources;
1546  }
1547
1548  getMmsSourceFromDataSource() {
1549    HiLog.i(TAG, 'getMmsSourceFromDataSource, start')
1550    let sources = [];
1551    this.textareaDatasource.forEach((item, index) => {
1552      let mms = {
1553        msgType: common.MSG_ITEM_TYPE.TEXT,
1554        msgUriPath: '',
1555        content: item.textValue,
1556        time: '',
1557        fileSize: 0
1558      };
1559      if (index === 0 && (this.messageType === common.MESSAGE_TYPE.THEME ||
1560        this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT)) {
1561        mms.msgType = common.MSG_ITEM_TYPE.THEME;
1562        sources.push(mms);
1563      } else if (this.messageType === common.MESSAGE_TYPE.THEME) {
1564        sources.push(mms);
1565        sources = this.getMmsSourceByTheme(sources, item, mms);
1566      } else {
1567        if (item.mms) {
1568          mms.msgType = item.mms.type;
1569          mms.msgUriPath = item.mms.uriPath;
1570          mms.time = item.mms.time;
1571          mms.fileSize = item.mms.fileSize;
1572        }
1573        sources.push(mms);
1574      }
1575    });
1576    return sources;
1577  }
1578
1579  getMmsSourceByTheme(sources, item, mms) {
1580    HiLog.i(TAG, 'getMmsSourceByTheme, start')
1581    if (this.mmsEditList.length === 1) {
1582      let first = this.mmsEditList[0];
1583      sources.unshift({
1584        msgType: first.type,
1585        msgUriPath: first.uriPath,
1586        content: item.textValue,
1587        time: first.time,
1588        fileSize: first.fileSize
1589      });
1590    } else {
1591      this.getMmsSourceByItem(sources, mms);
1592    }
1593    let arr = JSON.parse(JSON.stringify(sources));
1594    return arr;
1595  }
1596
1597  getMmsSourceByItem(sources, mms) {
1598    HiLog.i(TAG, 'getMmsSourceByItem, start')
1599    this.mmsEditList.forEach((list, i) => {
1600      if (i === 0) {
1601        mms.msgType = list.type;
1602        mms.msgUriPath = list.uriPath;
1603        mms.time = list.time;
1604        mms.fileSize = list.fileSize;
1605      } else {
1606        let mmsObj = {
1607          msgType: list.type,
1608          msgUriPath: list.uriPath,
1609          content: common.string.EMPTY_STR,
1610          time: list.time,
1611          fileSize: list.fileSize
1612        };
1613        sources.push(mmsObj);
1614      }
1615    });
1616  }
1617
1618  getMsgShowType(item) {
1619    HiLog.i(TAG, 'getMsgShowType, start')
1620    let type = common.MESSAGE_SHOW_TYPE.NORMAL;
1621    let slideString = 'msg_slide';
1622    if (this.messageType === common.MESSAGE_TYPE.NORMAL && this.mmsEditList.length <= 1) {
1623      type = common.MESSAGE_SHOW_TYPE.NORMAL;
1624      item.content = this.textValue;
1625    } else if (this.messageType === common.MESSAGE_TYPE.THEME && this.mmsEditList.length === 1) {
1626      type = common.MESSAGE_SHOW_TYPE.THEME_IMAGE;
1627      item.content = this.getThemeContent();
1628    } else {
1629      type = this.getMsgShowTypePpt(item, slideString);
1630    }
1631    if (type == common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE || type == common.MESSAGE_SHOW_TYPE.PPT_IMAGE) {
1632      if (item.content == common.string.EMPTY_STR) {
1633        item.content = slideString;
1634      }
1635    }
1636    return type;
1637  }
1638
1639  getMsgShowTypePpt(item, slideString) {
1640    HiLog.i(TAG, 'getMsgShowTypePpt, start')
1641    let type = common.MESSAGE_SHOW_TYPE.NORMAL;
1642    let hasSource = this.textareaDatasource.length > 0 ? true : false;
1643    let firstStr = hasSource ? this.textareaDatasource[0].textValue : common.string.EMPTY_STR;
1644    if (this.mmsEditList.length === 0) {
1645      type = common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE;
1646      if (this.messageType === common.MESSAGE_TYPE.THEME ||
1647        this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT) {
1648        item.content = this.getThemeContent();
1649      } else {
1650        item.content = (firstStr == common.string.EMPTY_STR) ? slideString : firstStr;
1651      }
1652    } else {
1653      type = this.getPPTType();
1654      this.getMsgShowTypeContent(item, firstStr, slideString);
1655    }
1656    return type;
1657  }
1658
1659  getPPTType() {
1660    HiLog.i(TAG, 'getPPTType, start')
1661    let type = common.MESSAGE_SHOW_TYPE.NORMAL;
1662    if (this.messageType === common.MESSAGE_TYPE.NORMAL && this.mmsEditList.length > 0) {
1663      type = common.MESSAGE_SHOW_TYPE.PPT_IMAGE;
1664    } else {
1665      let firstMms = null;
1666      if (this.messageType === common.MESSAGE_TYPE.THEME && this.mmsEditList.length > 1) {
1667        firstMms = this.mmsEditList[0];
1668      } else if (this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT) {
1669        firstMms = this.textareaDatasource[1].mms;
1670      } else {
1671        firstMms = this.textareaDatasource[0].mms;
1672      }
1673      if (this.mmsEditList.length >= 1 && firstMms &&
1674        (firstMms.type === common.MSG_ITEM_TYPE.IMAGE || firstMms.type === common.MSG_ITEM_TYPE.VIDEO)) {
1675        type = common.MESSAGE_SHOW_TYPE.PPT_IMAGE;
1676      } else {
1677        type = common.MESSAGE_SHOW_TYPE.PPT_NO_IMAGE;
1678      }
1679    }
1680    return type;
1681  }
1682
1683  getMsgShowTypeContent(item, firstStr, slideString) {
1684    HiLog.i(TAG, 'getMsgShowTypeContent, start')
1685    if (this.messageType === common.MESSAGE_TYPE.THEME_AND_PPT ||
1686      this.messageType === common.MESSAGE_TYPE.THEME) {
1687      item.content = this.getThemeContent();
1688    } else {
1689      let content = common.string.EMPTY_STR;
1690      if (this.messageType === common.MESSAGE_TYPE.NORMAL) {
1691        content = (this.textValue == common.string.EMPTY_STR) ? slideString : this.textValue;
1692      } else {
1693        content = (firstStr == common.string.EMPTY_STR) ? slideString : firstStr;
1694      }
1695      item.content = content;
1696    }
1697  }
1698
1699  getThemeContent() {
1700    HiLog.i(TAG, 'getThemeContent, start')
1701    this.isEditMms = true;
1702    let content = '';
1703    let first = this.textareaDatasource[0].textValue;
1704    let text = this.textareaDatasource[1].textValue;
1705    if (first !== common.string.EMPTY_STR) {
1706      content = $r('app.string.msg_theme') + ': ' + first;
1707    }
1708    if (text !== common.string.EMPTY_STR) {
1709      if (content === common.string.EMPTY_STR) {
1710        content = text;
1711      } else {
1712        content = content + '\n' + text;
1713      }
1714    }
1715    return content;
1716  }
1717
1718  sendMassMessage(actionData, item) {
1719    this.insertInitData(actionData, item, result => {
1720      // Processing the sent result
1721      if (this.threadId != result.rowId) {
1722        // When modifying the recipient information, click Send and delete the session before the modification.
1723        let condition: LooseObject = {};
1724        condition.threadId = this.threadId;
1725        ConversationListService.getInstance().deleteSessionByCondition(condition, null, null);
1726      }
1727      this.threadId = result.rowId;
1728      this.portraitColor = AvatarColor.background.Color[Math.abs(this.threadId) % 6];
1729      item.groupId = result.groupId;
1730      if (result.initDatas[0] == undefined || result.initDatas[0] == null) {
1731        return;
1732      }
1733      if (result.initDatas[0].id == undefined || result.initDatas[0].id == null) {
1734        return;
1735      }
1736      item.id = result.initDatas[0].id;
1737      this.refresh = !this.refresh
1738      // Sending and processing the sending result
1739      this.dealSendResult(actionData, item, result.initDatas);
1740    });
1741  }
1742
1743  clearMsm() {
1744    if (this.isEditMms) {
1745      this.isEditMms = false;
1746    }
1747    // Deleting the preview image of an MMS message
1748    if (this.mmsEditList.length != 0) {
1749      for (let index in this.mmsEditList) {
1750        this.updatePreview(index);
1751      }
1752      this.mmsEditList = [];
1753    }
1754  }
1755
1756  resetMmsSource() {
1757    this.textareaDatasource = [];
1758    this.mmsEditList = [];
1759    this.pptTotalCount = 0;
1760    this.messageType = common.MESSAGE_TYPE.NORMAL;
1761    this.selectedTextareaIdx = -1;
1762  }
1763
1764  send() {
1765    HiLog.i(TAG, 'send, start');
1766    // The Send button is dimmed and messages cannot be sent.
1767    if (!this.canSendMessage) {
1768      HiLog.w(TAG, 'send, canSendMessage=false');
1769      return;
1770    }
1771    // Switching from the new state to the session state
1772    if (this.isNewMsg) {
1773      HiLog.i(TAG, 'send, isNewMsg=true');
1774      this.newSend(() => {
1775        this.sendDataRefresh();
1776      });
1777    } else {
1778      this.sendDataRefresh();
1779    }
1780  }
1781
1782  sendDataRefresh() {
1783    this.isSendStatus = true;
1784    this.slotId = MmsPreferences.getInstance().getSendMessageSlotId();
1785    if (this.textValue != common.string.EMPTY_STR || this.mmsEditList.length != 0 ||
1786      this.textareaDatasource.length != 0) {
1787      this.initSendItem();
1788    }
1789    let actionData: LooseObject = {};
1790    actionData.slotId = this.slotId;
1791    actionData.destinationHost = this.strContactsNumber;
1792    actionData.content = this.textValue;
1793    actionData.isEditMms = this.isEditMms;
1794    // Real SMS Sending
1795    this.sendInterval(actionData, this.mmsList);
1796    this.textValue = common.string.EMPTY_STR;
1797    this.canSendMessage = false;
1798    this.isShowFullScreen = false;
1799    this.clearMsm();
1800    this.resetMmsSource();
1801    this.setTabOperationStatus(false);
1802    this.distanceBottomFlag = false;
1803    this.receiveContactValue = common.string.EMPTY_STR;
1804    this.selectContacts = [];
1805    this.isNewMsg = false;
1806  }
1807
1808  isPhoneNumber(str) {
1809    // Determine whether the value is a number.
1810    let reg = /^\d{1,}$/;
1811    let pattern = new RegExp(reg);
1812    return pattern.test(str);
1813  }
1814
1815  newSend(callback) {
1816    // Check whether the entered content has a value.
1817    if (this.receiveContactValue != common.string.EMPTY_STR) {
1818      if (!this.isPhoneNumber(this.receiveContactValue)) {
1819        // Invalid Recipient
1820        this.showToast($r('app.string.invalid_receive', this.receiveContactValue))
1821        HiLog.w(TAG, 'newSend, PhoneNumber is invalidate');
1822        return;
1823      }
1824    }
1825    if (this.selectContacts.length > 0 && this.receiveContactValue != common.string.EMPTY_STR) {
1826      let selectContact = {
1827        telephone: this.receiveContactValue,
1828        telephoneFormat: this.receiveContactValue,
1829        contactName: common.string.EMPTY_STR
1830      }
1831      let selectContacts = this.selectContacts;
1832      selectContacts.push(selectContact);
1833      this.initNewSelectContacts(selectContacts);
1834    } else if (this.selectContacts.length > 0) {
1835      this.initNewSelectContacts(this.selectContacts);
1836    } else if (this.receiveContactValue != common.string.EMPTY_STR) {
1837      this.contactsNum = 1;
1838      this.strContactsNumber = this.receiveContactValue;
1839      this.strContactsNumberFormat = this.receiveContactValue;
1840    } else {
1841      HiLog.w(TAG, 'newSend, the contact condition is not met.')
1842      return;
1843    }
1844    this.isNewMsg = false;
1845    // To cancel sending, set this parameter to true.
1846    if (this.recallMessagesFlag) {
1847      this.isNewRecallMessagesFlag = true;
1848      this.commonCtrl.paramContact.isNewRecallMessagesFlag = true;
1849    }
1850    // When the new page is displayed in full screen mode, the following table data needs to be obtained.
1851    if (true) {
1852      this.queryOldMessageList(this.strContactsNumber, callback);
1853    }
1854  }
1855
1856  queryOldMessageList(telephone, callback) {
1857    HiLog.i(TAG, 'queryOldMessageList, start');
1858    if (telephone == common.string.EMPTY_STR) {
1859      return;
1860    }
1861    let number: string = telephoneUtil.dealTelephoneSort(telephone);
1862    ConversationListService.getInstance().querySessionByTelephone(number, res => {
1863      if (res.response == undefined || res.response == null) {
1864        return;
1865      }
1866      if (res.response.id == undefined || res.response.id == null) {
1867        return;
1868      }
1869      HiLog.i(TAG, 'queryOldMessageList, querySessionByTelephone res.response.id: ' + res.response.id);
1870      if (res.code == common.int.SUCCESS && res.response.id > 0) {
1871        if (this.threadId != res.response.id) {
1872          // When modifying the recipient information, click Send and delete the session before the
1873          // modification.
1874          let condition: LooseObject = {};
1875          condition.threadId = this.threadId;
1876          ConversationListService.getInstance().deleteSessionByCondition(condition, null, null);
1877        }
1878        this.isDraft = res.response.hasDraft;
1879        this.threadId = res.response.id;
1880        this.portraitColor = AvatarColor.background.Color[Math.abs(this.threadId) % 6];
1881        this.queryMessageDetail(telephone, res.response.id, callback);
1882        this.scroller.scrollToIndex(this.mmsList.length - 1);
1883      } else {
1884        callback();
1885      }
1886    }, null);
1887  }
1888
1889  initNewSelectContacts(selectContacts) {
1890    HiLog.i(TAG, 'initNewSelectContacts, start');
1891    let contactsNumber = common.string.EMPTY_STR;
1892    let contactsName = common.string.EMPTY_STR;
1893    let contactsNumberFormat = common.string.EMPTY_STR;
1894    let contacts = telephoneUtil.dealSelectContactsSort(selectContacts);
1895    let length = contacts.length;
1896    for (let index in contacts) {
1897      let item = contacts[index];
1898      contactsNumber = contactsNumber + item.telephone + common.string.COMMA;
1899      contactsNumberFormat = contactsNumberFormat + item.telephoneFormat + common.string.COMMA;
1900      if (item.contactName != common.string.EMPTY_STR) {
1901        contactsName += (item.contactName + common.string.COMMA);
1902      }
1903    }
1904    this.strContactsNumber = contactsNumber.substring(0, contactsNumber.length - 1);
1905    this.strContactsName = contactsName.substring(0, contactsName.length - 1);
1906    this.photoFirstNameDeal(this.strContactsName);
1907    this.strContactsNumberFormat = contactsNumberFormat.substring(0, contactsNumberFormat.length - 1);
1908    this.contactsNum = length;
1909  }
1910
1911  handleWithSend(actionData, item) {
1912    // Sending request processing
1913    let hosts: Array<string> = [];
1914    if (actionData.destinationHost.indexOf(',') == -1) {
1915      // single-shot
1916      hosts.push(actionData.destinationHost);
1917    } else {
1918      // Group Sending
1919      for (let host of actionData.destinationHost.split(',')) {
1920        hosts.push(telephoneUtil.formatTelephone(host));
1921      }
1922    }
1923    actionData.hosts = hosts;
1924    this.sendMassMessage(actionData, item);
1925  }
1926
1927  sendInterval(actionData, mmsList) {
1928    // Send Timer
1929    let item = mmsList[mmsList.length - 1];
1930    if (this.recallMessagesFlag) {
1931      item.intervalSendStatus = true;
1932      // Second countdown timer after the Send button is clicked
1933      item.sendIntervalId = setInterval(function () {
1934        item.cancelTimeCount--;
1935      }, 1000);
1936      // Transmit timer, which is sent after 6s.
1937      item.sendTimeoutId = setTimeout(() => {
1938        item.cancelTimeCount = 0;
1939        // Clear Timer
1940        clearTimeout(item.sendTimeoutId);
1941        clearInterval(item.sendIntervalId);
1942        this.handleWithSend(actionData, item);
1943      }, 6000);
1944    } else {
1945      this.handleWithSend(actionData, item);
1946    }
1947  }
1948
1949  changeValue(e) {
1950    this.textValue = e;
1951    if (e == null || e == common.string.EMPTY_STR) {
1952      if (this.mmsEditList.length != 0) {
1953        this.canSendMessage = true;
1954      } else {
1955        this.canSendMessage = false;
1956      }
1957      return;
1958    }
1959    // Whether to display full screen
1960    if (this.isEditMms) {
1961      this.isShowFullScreen = false;
1962    } else {
1963      this.isShowFullScreen = true;
1964    }
1965    if (this.isNewMsg) {
1966      if (this.receiveContactValue == '' && this.selectContacts.length == 0) {
1967        this.canSendMessage = false;
1968        return;
1969      }
1970    }
1971    if (this.textValue.length == 0) {
1972      this.canSendMessage = false;
1973      return;
1974    } else {
1975      this.canSendMessage = MmsPreferences.getInstance().haveSimCardReady() && !this.isFlightMode;
1976    }
1977    if (this.isNewMsg) {
1978      this.setCanSendMsgStatus();
1979    }
1980  }
1981
1982  setTabTitleText() {
1983    // TabTitleText selected globally
1984    if (this.tabIndex != 1) {
1985      // Non-picture page
1986      this.tabTitleText = this.tabTextList[this.tabIndex];
1987      return;
1988    }
1989    // On the image selection page, the number of selected images is displayed.
1990    let size = 0;
1991    for (let element of this.pictureListFromGallery) {
1992      if (element.checkedValue) {
1993        size++;
1994      }
1995    }
1996    this.tabTitleText = size == 0 ? $r('app.string.msg_unselected_tip') : $r('app.string.msg_selected_tip', {
1997      number: size
1998    });
1999  }
2000
2001  // Check whether the sending icon can be highlighted.
2002  judgeSendBtnCanClicked() {
2003    if (MmsPreferences.getInstance().haveSimCardReady() && (this.mmsEditList.length != 0 ||
2004      this.textValue != common.string.EMPTY_STR || this.textareaDatasource.length !== 0)) {
2005      if (this.isNewMsg) {
2006        if ((this.receiveContactValue !== '' && this.isPhoneNumber(this.receiveContactValue))
2007          || this.selectContacts.length !== 0) {
2008          this.canSendMessage = true;
2009        }
2010      } else {
2011        this.canSendMessage = true;
2012      }
2013    }
2014  }
2015
2016  // Subscribing to Public Events
2017  subscribeDetail() {
2018    HiLog.i(TAG, 'subscribeDetail, start');
2019    let events = [common.string.RECEIVE_TRANSMIT_EVENT]
2020    let commonEventSubscribeInfo = {
2021      events: events
2022    };
2023    // Creating Subscription Information
2024    commonEvent.createSubscriber(commonEventSubscribeInfo, this.createSubscriberCallBack.bind(this));
2025  }
2026
2027  createSubscriberCallBack(err, data) {
2028    this.commonEventData = data;
2029    // Received subscription
2030    commonEvent.subscribe(this.commonEventData, this.subscriberCallBack.bind(this));
2031  }
2032
2033  subscriberCallBack(err, data) {
2034    HiLog.i(TAG, 'subscriberCallBack, start');
2035    globalThis.needToUpdate = true;
2036    // Receiving SMS Updates
2037    this.queryMessageDetail(this.strContactsNumber, this.threadId, () => {
2038    });
2039    setTimeout(() => {
2040      this.scroller.scrollToIndex(this.mmsList.length - 1);
2041      let actionData: LooseObject = {};
2042      actionData.threadId = this.threadId;
2043      actionData.hasRead = common.is_read.UN_READ;
2044      NotificationService.getInstance().cancelMessageNotify(actionData);
2045      NotificationService.getInstance().updateBadgeNumber();
2046      ConversationListService.getInstance().markAllToRead(actionData);
2047      let lastItem: LooseObject = this.mmsList[this.mmsList.length - 1];
2048      if (lastItem != null && lastItem.subId != null) {
2049        this.notifySlotIdChange(lastItem.subId);
2050      }
2051    }, 500);
2052  }
2053
2054  // Unsubscribe
2055  unSubscribeDetail() {
2056    if (this.commonEventData != null) {
2057      commonEvent.unsubscribe(this.commonEventData, () => {
2058        HiLog.i(TAG, 'unSubscribeDetail, unsubscribe');
2059      });
2060    }
2061  }
2062
2063  notifySlotIdChange(slotId: number): void {
2064    if (MmsPreferences.getInstance().getSelectedSlotId() != slotId) {
2065      MmsPreferences.getInstance().setValueToMap(common.string.KEY_OF_SELECTED_SLOTID, slotId);
2066      HiLog.i(TAG, 'notifySlotIdChange, emit slotId: ' + slotId);
2067      emitter.emit(simCardService.SLOTID_CHANGE_EVENT, {
2068        data: {
2069          'slotId': slotId
2070        }
2071      });
2072    }
2073  }
2074
2075  // In the selection mode, tap More. In the displayed menu, select
2076  moreSelected(e) {
2077    HiLog.i(TAG, 'moreSelected, e: ' + JSON.stringify(e))
2078    switch (e) {
2079      case '0':
2080      // duplicating
2081        this.copyText();
2082        break;
2083      case 1:
2084      // Share
2085        this.share();
2086        break;
2087      case 2:
2088      // Select Text
2089        this.gotoTextSelect(this.mmsIndex);
2090        break;
2091      case 3:
2092      // lock
2093      //this.lock();
2094        break;
2095      case 4:
2096      // Show Details
2097        this.showDetails();
2098        break;
2099      case 5:
2100      // Unlock
2101      //this.unlock();
2102        break;
2103      case 6:
2104      // View Reports
2105        this.showReport(this.mmsIndex);
2106        break;
2107      case 7:
2108      // Save Attachments
2109        this.saveImage();
2110        break;
2111      case 8:
2112      // Querying vCard Details
2113        this.showVcarDetail(this.mmsIndex);
2114        break;
2115      default:
2116        break;
2117    }
2118    // Exit the multi-selection mode.
2119    this.exitMultiselect();
2120  }
2121
2122  copyText() {
2123    commonPasteboard.setPasteboard(this.mmsList[this.mmsIndex].content);
2124  }
2125
2126  share() {
2127    for (let i = 0; i < this.mmsList.length; i++) {
2128      if (this.mmsList[i].isCbChecked == true) {
2129        let actionData: LooseObject = {};
2130        actionData.content = this.mmsList[i].content;
2131        ConversationService.getInstance().gotoShare(actionData, null, null);
2132      }
2133    }
2134  }
2135
2136  gotoTextSelect(idx) {
2137    router.push({
2138      uri: 'pages/text_select/text_select',
2139      params: this.mmsList[idx]
2140    })
2141  }
2142
2143  showDetails() {
2144    for (let index = 0; index < this.mmsList.length; index++) {
2145      if (this.mmsList[index].isCbChecked == true) {
2146        var time = this.mmsList[index].timeMillisecond;
2147        var timeStash = this.getTime(time);
2148        this.mmsTime = timeStash + this.mmsList[index].time;
2149        if (this.mmsList[index].msgType == 0) {
2150          this.isMmsType = $r('app.string.sms');
2151        } else {
2152          this.isMmsType = $r('app.string.mms');
2153        }
2154
2155        if (this.mmsList[index].isReceive) {
2156          this.isSendRecipient = true;
2157        } else {
2158          this.isSendRecipient = false;
2159        }
2160      }
2161    }
2162    //    this.$element('mms_details_dialog').show();
2163  }
2164
2165  showReport(mmsIndex) {
2166    // View Reports
2167    let item = this.mmsList[mmsIndex];
2168    router.push({
2169      uri: 'pages/queryreport/queryReport',
2170      params: {
2171        isMsm: item.isMsm,
2172        telephone: this.strContactsNumber,
2173        sendStatus: item.sendStatus,
2174        timeMillisecond: item.timeMillisecond
2175      },
2176    });
2177  }
2178
2179  saveImage() {
2180    var actionData: LooseObject = {};
2181    actionData.threadId = this.mmsList[this.mmsIndex]?.threadId;
2182    actionData.pduId = this.mmsList[this.mmsIndex]?.pduId;
2183    ConversationService.getInstance().saveImage(actionData, result => {
2184      this.showToast(result);
2185    }, null);
2186  }
2187
2188  showVcarDetail(mmsIndex) {
2189
2190  }
2191
2192  exitMultiselect() {
2193    // Exit the multi-selection state.
2194    this.isSelectStatus = false;
2195    this.cancelCheckedAll();
2196  }
2197
2198  longPressMore(e) {
2199    switch (e) {
2200      case 0:
2201      // delete
2202        this.deleteDetail();
2203        break;
2204      case 1:
2205      // New Contact
2206        this.createNewContact(this.strContactsNumber);
2207        break;
2208      case 2:
2209      // Save to Existing Contacts
2210        this.existingContact(this.strContactsNumber);
2211        break;
2212      case 3:
2213      // Edit Before Call
2214        this.callEditor(this.strContactsNumber);
2215        break;
2216      case 4:
2217      // Add to Blocklist
2218        this.callEditor(this.strContactsNumber);
2219        break;
2220      case 5:
2221      // View Contacts
2222        this.titleBarAvatar();
2223        break;
2224      default:
2225        break;
2226    }
2227  }
2228
2229  // Delete
2230  deleteDetail() {
2231    if (this.mmsList.length == 1) {
2232      this.strMsgDeleteDialogTip = $r('app.string.msg_delete_dialog_con_tip3');
2233    } else {
2234      this.hasDetailDelete = false;
2235      this.isSelectStatus = true;
2236    }
2237  }
2238
2239  // New Contact
2240  createNewContact(number) {
2241    var actionData: LooseObject = {};
2242    actionData.phoneNumber = number;
2243    actionData.pageFlag = common.contactPage.PAGE_FLAG_SAVE_CONTACT;
2244    this.jumpToContact(actionData);
2245  }
2246
2247  // Edit Before Call
2248  callEditor(number) {
2249    var actionData: LooseObject = {};
2250    actionData.phoneNumber = number;
2251    actionData.pageFlag = common.contactPage.PAGE_FLAG_EDIT_BEFORE_CALLING;
2252    this.jumpToContact(actionData);
2253  }
2254
2255  // Save to Existing Contacts
2256  existingContact(number) {
2257    var actionData: LooseObject = {};
2258    actionData.phoneNumber = number;
2259    actionData.pageFlag = common.contactPage.PAGE_FLAG_SAVE_EXIST_CONTACT;
2260    this.jumpToContact(actionData);
2261  }
2262
2263  // Switching to the Contacts app
2264  jumpToContact(actionData) {
2265    let str = commonService.commonContactParam(actionData);
2266    globalThis.mmsContext.startAbility(str).then((data) => {
2267      HiLog.i(TAG, 'jumpToContact, startAbility Success');
2268    }).catch((error) => {
2269      HiLog.e(TAG, 'jumpToContact, failed. Cause: ' + JSON.stringify(error.message));
2270    })
2271  }
2272
2273  // Tap a contact's avatar to go to the contact details page.
2274  titleBarAvatar() {
2275    var actionData = {
2276      phoneNumber: this.strContactsNumber,
2277      pageFlag: common.contactPage.PAGE_FLAG_CONTACT_DETAILS
2278    };
2279    this.jumpToContact(actionData);
2280  }
2281
2282  clickCall() {
2283    this.call(this.strContactsNumber);
2284  }
2285
2286  call(telephone) {
2287    // Calling
2288    callService.call(telephone, result => {
2289      if (result.code == common.int.SUCCESS) {
2290        HiLog.i(TAG, 'call success');
2291      } else {
2292        HiLog.w(TAG, 'call failed');
2293      }
2294    });
2295  }
2296
2297  getTime(nS) {
2298    var date = new Date(parseInt(nS));
2299    var year = date.getFullYear();
2300    var mon = date.getMonth() + 1;
2301    var day = date.getDate();
2302    return year; // + $r('app.string.year') + mon + $r('app.string.month') + day + $r('app.string.day');
2303  }
2304
2305  // Contact data returned on the new page
2306  setReceiveContactValue(receiverData) {
2307    let selectContacts = receiverData.selectContacts;
2308    let receiveContactValue = selectContacts.length > 0 ? common.string.EMPTY_STR : receiverData.contactValue;
2309    let hasBlur = receiverData.hasBlur;
2310    let telephone = common.string.EMPTY_STR;
2311    this.setCanSendMessage(selectContacts, receiveContactValue)
2312    if (receiveContactValue != this.strContactsName && router.getParams[0]?.isDraft == null) {
2313      this.isDraft = false;
2314    }
2315    if (hasBlur && receiveContactValue != common.string.EMPTY_STR) {
2316      let index = -1;
2317      for (let i = 0; i < selectContacts.length; i++) {
2318        let contact = selectContacts[i];
2319        if (contact.telephone == receiveContactValue) {
2320          index = i;
2321          break;
2322        }
2323      }
2324      if (index >= 0) {
2325        selectContacts.splice(index, 1);
2326      }
2327    }
2328    if (receiveContactValue != common.string.EMPTY_STR) {
2329      this.receiveContactValue = receiveContactValue;
2330    } else {
2331      this.receiveContactValue = common.string.EMPTY_STR;
2332    }
2333    if (selectContacts.length > 0) {
2334      for (let item of selectContacts) {
2335        if (!this.isPhoneNumber(item.telephone)) {
2336          item.telephone = this.replaceCode(item.telephone);
2337          item.telephoneFormat = this.replaceCode(item.telephoneFormat);
2338          if (item.contactName != common.string.EMPTY_STR) {
2339            item.contactName = common.string.EMPTY_STR;
2340          }
2341        }
2342        if (this.selectContacts.length > 1) {
2343          break
2344        }
2345        this.selectContacts = selectContacts;
2346      }
2347    } else {
2348      this.selectContacts = [];
2349    }
2350    if (this.selectContacts.length > 0) {
2351      for (let element of this.selectContacts) {
2352        telephone += element.telephone + common.string.COMMA;
2353      }
2354    }
2355    if (this.receiveContactValue != common.string.EMPTY_STR) {
2356      telephone += this.receiveContactValue + common.string.COMMA;
2357    }
2358    if (telephone != common.string.EMPTY_STR) {
2359      telephone = telephone.substring(0, telephone.length - 1);
2360    }
2361    if (!hasBlur && telephone != '') {
2362      this.queryOldMessageList(telephone, () => {
2363      });
2364    }
2365  }
2366
2367  setCanSendMessage(selectContacts, receiveContactValue) {
2368    if (this.textValue != common.string.EMPTY_STR || this.isEditMms) {
2369      if (this.canSendMessage) {
2370        if (selectContacts.length == 0 && receiveContactValue == common.string.EMPTY_STR) {
2371          this.canSendMessage = false;
2372        }
2373      } else if ((selectContacts.length != 0 || receiveContactValue != common.string.EMPTY_STR)
2374        && MmsPreferences.getInstance().haveSimCardReady()) {
2375        this.canSendMessage = true;
2376      }
2377    }
2378  }
2379}