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