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