1048147e0Sopenharmony_ci/** 2048147e0Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3048147e0Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4048147e0Sopenharmony_ci * you may not use this file except in compliance with the License. 5048147e0Sopenharmony_ci * You may obtain a copy of the License at 6048147e0Sopenharmony_ci * 7048147e0Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8048147e0Sopenharmony_ci * 9048147e0Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10048147e0Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11048147e0Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12048147e0Sopenharmony_ci * See the License for the specific language governing permissions and 13048147e0Sopenharmony_ci * limitations under the License. 14048147e0Sopenharmony_ci */ 15048147e0Sopenharmony_ci 16048147e0Sopenharmony_ciimport ConversationModel from '../model/ConversationModel'; 17048147e0Sopenharmony_ciimport common from '../data/commonData'; 18048147e0Sopenharmony_ciimport HiLog from '../utils//HiLog'; 19048147e0Sopenharmony_ciimport ConversationListService from './ConversationListService'; 20048147e0Sopenharmony_ciimport telephoneUtils from '../utils/TelephoneUtil'; 21048147e0Sopenharmony_ciimport ContactsService from './ContactsService'; 22048147e0Sopenharmony_ciimport LooseObject from '../data/LooseObject'; 23048147e0Sopenharmony_ci 24048147e0Sopenharmony_ciconst TAG: string = 'ConversationService'; 25048147e0Sopenharmony_ci 26048147e0Sopenharmony_ciexport default class ConversationService { 27048147e0Sopenharmony_ci private static instance: ConversationService; 28048147e0Sopenharmony_ci private conversationModel: ConversationModel = new ConversationModel(); 29048147e0Sopenharmony_ci 30048147e0Sopenharmony_ci private constructor() { 31048147e0Sopenharmony_ci } 32048147e0Sopenharmony_ci 33048147e0Sopenharmony_ci public static getInstance(): ConversationService { 34048147e0Sopenharmony_ci if (ConversationService.instance == null) { 35048147e0Sopenharmony_ci ConversationService.instance = new ConversationService(); 36048147e0Sopenharmony_ci } 37048147e0Sopenharmony_ci return ConversationService.instance; 38048147e0Sopenharmony_ci } 39048147e0Sopenharmony_ci 40048147e0Sopenharmony_ci public insertSmsMmsInfo(valueBucket, callback, context): void { 41048147e0Sopenharmony_ci let mmsContext = context ? context : globalThis.mmsContext; 42048147e0Sopenharmony_ci if (globalThis.DataWorker != null) { 43048147e0Sopenharmony_ci globalThis.DataWorker.sendRequest(common.RUN_IN_WORKER_METHOD.insertSmsMmsInfo, { 44048147e0Sopenharmony_ci valueBucket: valueBucket, 45048147e0Sopenharmony_ci context: mmsContext 46048147e0Sopenharmony_ci }, res => { 47048147e0Sopenharmony_ci if (callback) { 48048147e0Sopenharmony_ci callback(res); 49048147e0Sopenharmony_ci } 50048147e0Sopenharmony_ci }); 51048147e0Sopenharmony_ci } else { 52048147e0Sopenharmony_ci this.conversationModel.insertSmsMmsInfo(valueBucket, callback, mmsContext); 53048147e0Sopenharmony_ci } 54048147e0Sopenharmony_ci } 55048147e0Sopenharmony_ci 56048147e0Sopenharmony_ci public deleteSmsMmsInfoByCondition(actionData, callback, context): void { 57048147e0Sopenharmony_ci let mmsContext = context ? context : globalThis.mmsContext; 58048147e0Sopenharmony_ci if (globalThis.DataWorker != null) { 59048147e0Sopenharmony_ci globalThis.DataWorker.sendRequest(common.RUN_IN_WORKER_METHOD.deleteSmsMmsInfoByCondition, { 60048147e0Sopenharmony_ci actionData: actionData, 61048147e0Sopenharmony_ci context: mmsContext 62048147e0Sopenharmony_ci }, res => { 63048147e0Sopenharmony_ci if (callback) { 64048147e0Sopenharmony_ci callback(res); 65048147e0Sopenharmony_ci } 66048147e0Sopenharmony_ci }); 67048147e0Sopenharmony_ci } else { 68048147e0Sopenharmony_ci this.conversationModel.deleteSmsMmsInfoByCondition(actionData, callback, mmsContext); 69048147e0Sopenharmony_ci } 70048147e0Sopenharmony_ci } 71048147e0Sopenharmony_ci 72048147e0Sopenharmony_ci public updateSmsMmsInfoByCondition(actionData, valueBucket, callback, context): void { 73048147e0Sopenharmony_ci let mmsContext = context ? context : globalThis.mmsContext; 74048147e0Sopenharmony_ci if (globalThis.DataWorker != null) { 75048147e0Sopenharmony_ci globalThis.DataWorker.sendRequest(common.RUN_IN_WORKER_METHOD.updateSmsMmsInfoByCondition, { 76048147e0Sopenharmony_ci actionData: actionData, 77048147e0Sopenharmony_ci valueBucket: valueBucket, 78048147e0Sopenharmony_ci context: mmsContext 79048147e0Sopenharmony_ci }, res => { 80048147e0Sopenharmony_ci if (callback) { 81048147e0Sopenharmony_ci callback(res); 82048147e0Sopenharmony_ci } 83048147e0Sopenharmony_ci }); 84048147e0Sopenharmony_ci } else { 85048147e0Sopenharmony_ci this.conversationModel.updateSmsMmsInfoByCondition(actionData, valueBucket, callback, mmsContext); 86048147e0Sopenharmony_ci } 87048147e0Sopenharmony_ci } 88048147e0Sopenharmony_ci 89048147e0Sopenharmony_ci public querySmsMmsInfoByCondition(actionData, callback, context): void { 90048147e0Sopenharmony_ci let mmsContext = context ? context : globalThis.mmsContext; 91048147e0Sopenharmony_ci if (globalThis.DataWorker != null) { 92048147e0Sopenharmony_ci globalThis.DataWorker.sendRequest(common.RUN_IN_WORKER_METHOD.querySmsMmsInfoByCondition, { 93048147e0Sopenharmony_ci actionData: actionData, 94048147e0Sopenharmony_ci context: mmsContext 95048147e0Sopenharmony_ci }, res => { 96048147e0Sopenharmony_ci callback(res); 97048147e0Sopenharmony_ci }); 98048147e0Sopenharmony_ci } else { 99048147e0Sopenharmony_ci this.conversationModel.querySmsMmsInfoByCondition(actionData, callback, mmsContext); 100048147e0Sopenharmony_ci } 101048147e0Sopenharmony_ci } 102048147e0Sopenharmony_ci 103048147e0Sopenharmony_ci public querySmsMmsInfoSizeByCondition(actionData, callback, context): void { 104048147e0Sopenharmony_ci let mmsContext = context ? context : globalThis.mmsContext; 105048147e0Sopenharmony_ci if (globalThis.DataWorker != null) { 106048147e0Sopenharmony_ci globalThis.DataWorker.sendRequest(common.RUN_IN_WORKER_METHOD.querySmsMmsInfoSizeByCondition, { 107048147e0Sopenharmony_ci actionData: actionData, 108048147e0Sopenharmony_ci context: mmsContext 109048147e0Sopenharmony_ci }, res => { 110048147e0Sopenharmony_ci callback(res); 111048147e0Sopenharmony_ci }); 112048147e0Sopenharmony_ci } else { 113048147e0Sopenharmony_ci this.conversationModel.querySmsMmsInfoSizeByCondition(actionData, callback, mmsContext); 114048147e0Sopenharmony_ci } 115048147e0Sopenharmony_ci } 116048147e0Sopenharmony_ci 117048147e0Sopenharmony_ci public statisticalData(callback, context) { 118048147e0Sopenharmony_ci let mmsContext = context ? context : globalThis.mmsContext; 119048147e0Sopenharmony_ci if (globalThis.DataWorker != null) { 120048147e0Sopenharmony_ci globalThis.DataWorker.sendRequest(common.RUN_IN_WORKER_METHOD.statisticalData, { 121048147e0Sopenharmony_ci context: mmsContext 122048147e0Sopenharmony_ci }, res => { 123048147e0Sopenharmony_ci callback(res); 124048147e0Sopenharmony_ci }); 125048147e0Sopenharmony_ci } else { 126048147e0Sopenharmony_ci this.conversationModel.statisticalData(callback, mmsContext); 127048147e0Sopenharmony_ci } 128048147e0Sopenharmony_ci } 129048147e0Sopenharmony_ci 130048147e0Sopenharmony_ci public queryMaxGroupId(callback, context): void { 131048147e0Sopenharmony_ci let mmsContext = context ? context : globalThis.mmsContext; 132048147e0Sopenharmony_ci if (globalThis.DataWorker != null) { 133048147e0Sopenharmony_ci globalThis.DataWorker.sendRequest(common.RUN_IN_WORKER_METHOD.queryMaxGroupId, { 134048147e0Sopenharmony_ci context: mmsContext 135048147e0Sopenharmony_ci }, res => { 136048147e0Sopenharmony_ci callback(res); 137048147e0Sopenharmony_ci }); 138048147e0Sopenharmony_ci } else { 139048147e0Sopenharmony_ci this.conversationModel.queryMaxGroupId(callback, mmsContext); 140048147e0Sopenharmony_ci } 141048147e0Sopenharmony_ci } 142048147e0Sopenharmony_ci 143048147e0Sopenharmony_ci public queryMessageDetail(actionData, callback, context): void { 144048147e0Sopenharmony_ci this.querySmsMmsInfoByCondition(actionData, res => { 145048147e0Sopenharmony_ci let result: LooseObject = {}; 146048147e0Sopenharmony_ci result.code = res.code; 147048147e0Sopenharmony_ci if (res.code == common.int.SUCCESS) { 148048147e0Sopenharmony_ci this.groupDetailMessage(res.abilityResult, actionData, resultList => { 149048147e0Sopenharmony_ci result.response = resultList; 150048147e0Sopenharmony_ci callback(result); 151048147e0Sopenharmony_ci }); 152048147e0Sopenharmony_ci } else { 153048147e0Sopenharmony_ci HiLog.w(TAG, 'queryMessageDetail, failed'); 154048147e0Sopenharmony_ci callback(result); 155048147e0Sopenharmony_ci } 156048147e0Sopenharmony_ci }, context); 157048147e0Sopenharmony_ci } 158048147e0Sopenharmony_ci 159048147e0Sopenharmony_ci public convertConversationList(mmsList): Array<LooseObject> { 160048147e0Sopenharmony_ci let resultList: Array<LooseObject> = []; 161048147e0Sopenharmony_ci for (let item of mmsList) { 162048147e0Sopenharmony_ci let result: LooseObject = {}; 163048147e0Sopenharmony_ci result.id = item.msgId; 164048147e0Sopenharmony_ci result.content = item.msgContent; 165048147e0Sopenharmony_ci result.isLock = item.isLock == 0 ? false : true; 166048147e0Sopenharmony_ci result.isStared = item.isCollect == 0 ? false : true; 167048147e0Sopenharmony_ci // Fields related to MMS messages 168048147e0Sopenharmony_ci result.msgType = 0; 169048147e0Sopenharmony_ci result.isFullScreenImg = true; 170048147e0Sopenharmony_ci result.read = item.isRead == 0 ? '0' : '1'; 171048147e0Sopenharmony_ci if (item.msgState == 0) { 172048147e0Sopenharmony_ci result.sendStatus = common.int.SEND_MESSAGE_SUCCESS; 173048147e0Sopenharmony_ci } else if (item.msgState == 2) { 174048147e0Sopenharmony_ci result.sendStatus = common.int.SEND_MESSAGE_FAILED; 175048147e0Sopenharmony_ci } else if (item.msgState == 1) { 176048147e0Sopenharmony_ci result.sendStatus = common.int.SEND_MESSAGE_SENDING; 177048147e0Sopenharmony_ci } else { 178048147e0Sopenharmony_ci result.sendStatus = common.int.SEND_DRAFT; 179048147e0Sopenharmony_ci } 180048147e0Sopenharmony_ci result.subId = item.slotId; 181048147e0Sopenharmony_ci result.timeMillisecond = item.startTime; 182048147e0Sopenharmony_ci result.isMsm = item.msgType == 0 ? false : true; 183048147e0Sopenharmony_ci result.isCbChecked = false; 184048147e0Sopenharmony_ci result.isDraft = false; 185048147e0Sopenharmony_ci // Fields related to group-sending 186048147e0Sopenharmony_ci result.groupId = item.groupId; 187048147e0Sopenharmony_ci // Determine whether it is the receiver or sender. 188048147e0Sopenharmony_ci result.isReceive = item.isSender == 0 ? false : true; 189048147e0Sopenharmony_ci result.date = common.string.EMPTY_STR; 190048147e0Sopenharmony_ci result.time = common.string.EMPTY_STR; 191048147e0Sopenharmony_ci result.completeNumber = 0; 192048147e0Sopenharmony_ci result.failuresNumber = 0; 193048147e0Sopenharmony_ci result.hasReport = item.isSendReport == 0 ? false : true; 194048147e0Sopenharmony_ci if (!result.isMsm) { 195048147e0Sopenharmony_ci result.msgShowType = common.MESSAGE_SHOW_TYPE.NORMAL; 196048147e0Sopenharmony_ci } 197048147e0Sopenharmony_ci resultList.push(result); 198048147e0Sopenharmony_ci } 199048147e0Sopenharmony_ci return resultList; 200048147e0Sopenharmony_ci } 201048147e0Sopenharmony_ci 202048147e0Sopenharmony_ci public groupDetailMessage(mmsList, actionData, callback): void { 203048147e0Sopenharmony_ci let details: Array<LooseObject> = this.convertConversationList(mmsList); 204048147e0Sopenharmony_ci if (actionData.contactsNum == 1) { 205048147e0Sopenharmony_ci callback(details); 206048147e0Sopenharmony_ci return; 207048147e0Sopenharmony_ci } 208048147e0Sopenharmony_ci let resultList: Array<LooseObject> = []; 209048147e0Sopenharmony_ci // Group by groupId. 210048147e0Sopenharmony_ci let detailMap = this.convertConversationMap(details); 211048147e0Sopenharmony_ci // By group 212048147e0Sopenharmony_ci let groupIds = detailMap.keys(); 213048147e0Sopenharmony_ci for (let groupId of groupIds) { 214048147e0Sopenharmony_ci let groups = detailMap.get(groupId); 215048147e0Sopenharmony_ci let result: LooseObject = groups[0]; 216048147e0Sopenharmony_ci let failuresNumber = 0; 217048147e0Sopenharmony_ci let completeNumber = 0; 218048147e0Sopenharmony_ci for (let item of groups) { 219048147e0Sopenharmony_ci if (item.sendStatus == common.int.SEND_MESSAGE_FAILED) { 220048147e0Sopenharmony_ci failuresNumber++; 221048147e0Sopenharmony_ci } 222048147e0Sopenharmony_ci if (item.sendStatus == common.int.SEND_MESSAGE_FAILED || item.sendStatus == common.int.SEND_MESSAGE_SUCCESS) { 223048147e0Sopenharmony_ci completeNumber++; 224048147e0Sopenharmony_ci } 225048147e0Sopenharmony_ci } 226048147e0Sopenharmony_ci result.completeNumber = completeNumber; 227048147e0Sopenharmony_ci result.failuresNumber = failuresNumber; 228048147e0Sopenharmony_ci resultList.push(result); 229048147e0Sopenharmony_ci } 230048147e0Sopenharmony_ci callback(resultList); 231048147e0Sopenharmony_ci } 232048147e0Sopenharmony_ci 233048147e0Sopenharmony_ci public convertConversationMap(details) { 234048147e0Sopenharmony_ci let conversationMap = new Map(); 235048147e0Sopenharmony_ci // grouping 236048147e0Sopenharmony_ci for (let element of details) { 237048147e0Sopenharmony_ci if (conversationMap.has(element.groupId)) { 238048147e0Sopenharmony_ci let groups = conversationMap.get(element.groupId); 239048147e0Sopenharmony_ci groups.push(element); 240048147e0Sopenharmony_ci } else { 241048147e0Sopenharmony_ci let groups = []; 242048147e0Sopenharmony_ci groups.push(element); 243048147e0Sopenharmony_ci conversationMap.set(element.groupId, groups); 244048147e0Sopenharmony_ci } 245048147e0Sopenharmony_ci } 246048147e0Sopenharmony_ci return conversationMap; 247048147e0Sopenharmony_ci } 248048147e0Sopenharmony_ci 249048147e0Sopenharmony_ci public insertSessionAndDetail(actionData, callback, context): void { 250048147e0Sopenharmony_ci let sendResults: Array<LooseObject> = actionData.sendResults; 251048147e0Sopenharmony_ci let isReceive: boolean = actionData.isReceive; 252048147e0Sopenharmony_ci if (sendResults.length == 0) { 253048147e0Sopenharmony_ci HiLog.w(TAG, 'insertSessionAndDetail, sendResults.length == 0'); 254048147e0Sopenharmony_ci return; 255048147e0Sopenharmony_ci } 256048147e0Sopenharmony_ci let param: LooseObject = this.dealSendResults(sendResults); 257048147e0Sopenharmony_ci // Check whether a session list has been created. 258048147e0Sopenharmony_ci ConversationListService.getInstance().querySessionByTelephone(param.telephone, res => { 259048147e0Sopenharmony_ci let response: LooseObject = res.response; 260048147e0Sopenharmony_ci if (res.code == common.int.SUCCESS && response.id <= 0) { 261048147e0Sopenharmony_ci this.dealNoExistSession(isReceive, param, actionData, callback, context); 262048147e0Sopenharmony_ci } else { 263048147e0Sopenharmony_ci this.dealExistSession(response, param, actionData, callback, context); 264048147e0Sopenharmony_ci } 265048147e0Sopenharmony_ci }, context); 266048147e0Sopenharmony_ci } 267048147e0Sopenharmony_ci 268048147e0Sopenharmony_ci public dealNoExistSession(isReceive, param, actionData, callback, context): void { 269048147e0Sopenharmony_ci let unreadCount: number = 0; 270048147e0Sopenharmony_ci if (isReceive) { 271048147e0Sopenharmony_ci unreadCount = 1; 272048147e0Sopenharmony_ci } 273048147e0Sopenharmony_ci let valueBucket: LooseObject = { 274048147e0Sopenharmony_ci 'telephone': param.telephone, 275048147e0Sopenharmony_ci 'content': param.content, 276048147e0Sopenharmony_ci 'contacts_num': param.contactsNum, 277048147e0Sopenharmony_ci 'sms_type': param.smsType, 278048147e0Sopenharmony_ci 'unread_count': unreadCount, 279048147e0Sopenharmony_ci 'sending_status': param.sendStatus, 280048147e0Sopenharmony_ci 'has_draft': common.has_draft.NO, 281048147e0Sopenharmony_ci 'time': param.timestamp, 282048147e0Sopenharmony_ci 'message_count': 1, 283048147e0Sopenharmony_ci 'has_mms': actionData.isMms ? common.has_mms.HAVE : common.has_mms.NO, 284048147e0Sopenharmony_ci 'has_attachment': actionData.hasAttachment ? common.has_attachment.HAVE : common.has_attachment.NO 285048147e0Sopenharmony_ci } 286048147e0Sopenharmony_ci ConversationListService.getInstance().insertSession(valueBucket, sessionResult => { 287048147e0Sopenharmony_ci HiLog.i(TAG, 'dealNoExistSession, insertSession callback'); 288048147e0Sopenharmony_ci if (sessionResult.code == common.int.FAILURE) { 289048147e0Sopenharmony_ci HiLog.e(TAG, 'dealNoExistSession, insertSession fail!'); 290048147e0Sopenharmony_ci callback(sessionResult); 291048147e0Sopenharmony_ci return; 292048147e0Sopenharmony_ci } 293048147e0Sopenharmony_ci // Invoke the SMS database to insert SMS messages. 294048147e0Sopenharmony_ci this.dealInsertMessageDetail(param, actionData, sessionResult.abilityResult, res => { 295048147e0Sopenharmony_ci let result: LooseObject = { 296048147e0Sopenharmony_ci 'rowId': sessionResult.abilityResult, 297048147e0Sopenharmony_ci 'initDatas': res.initDatas, 298048147e0Sopenharmony_ci 'groupId': res.groupId 299048147e0Sopenharmony_ci } 300048147e0Sopenharmony_ci callback(result); 301048147e0Sopenharmony_ci }, context); 302048147e0Sopenharmony_ci }, context); 303048147e0Sopenharmony_ci } 304048147e0Sopenharmony_ci 305048147e0Sopenharmony_ci public dealExistSession(response, param, actionData, callback, context): void { 306048147e0Sopenharmony_ci let unreadCount: number = 0; 307048147e0Sopenharmony_ci if (actionData.isReceive) { 308048147e0Sopenharmony_ci unreadCount = response.unreadCount + 1; 309048147e0Sopenharmony_ci } 310048147e0Sopenharmony_ci let hasDraft: number = response.hasDraft; 311048147e0Sopenharmony_ci if (actionData.hasDraft && hasDraft == 1) { 312048147e0Sopenharmony_ci hasDraft = 0; 313048147e0Sopenharmony_ci } 314048147e0Sopenharmony_ci let valueBucket: LooseObject = { 315048147e0Sopenharmony_ci 'content': param.content, 316048147e0Sopenharmony_ci 'unread_count': unreadCount, 317048147e0Sopenharmony_ci 'time': new Date().getTime(), 318048147e0Sopenharmony_ci 'sending_status': param.sendStatus, 319048147e0Sopenharmony_ci 'has_draft': hasDraft, 320048147e0Sopenharmony_ci 'message_count': (response.messageCount + 1), 321048147e0Sopenharmony_ci 'has_attachment': actionData.hasAttachment ? 1 : 0, 322048147e0Sopenharmony_ci 'has_mms': actionData.isMms ? 1 : 0, 323048147e0Sopenharmony_ci } 324048147e0Sopenharmony_ci let sessionId: number = response.id; 325048147e0Sopenharmony_ci let condition: LooseObject = {}; 326048147e0Sopenharmony_ci condition.threadId = sessionId; 327048147e0Sopenharmony_ci ConversationListService.getInstance().updateSessionByCondition(condition, valueBucket, res => { 328048147e0Sopenharmony_ci // Invoke the SMS database to insert SMS messages. 329048147e0Sopenharmony_ci this.dealInsertMessageDetail(param, actionData, sessionId, res => { 330048147e0Sopenharmony_ci let result: LooseObject = { 331048147e0Sopenharmony_ci 'rowId': sessionId, 332048147e0Sopenharmony_ci 'initDatas': res.initDatas, 333048147e0Sopenharmony_ci 'groupId': res.groupId 334048147e0Sopenharmony_ci } 335048147e0Sopenharmony_ci callback(result); 336048147e0Sopenharmony_ci }, context); 337048147e0Sopenharmony_ci }, context); 338048147e0Sopenharmony_ci } 339048147e0Sopenharmony_ci 340048147e0Sopenharmony_ci public dealInsertMessageDetail(param, actionData, threadId, callback, context): void { 341048147e0Sopenharmony_ci this.queryMaxGroupId(res => { 342048147e0Sopenharmony_ci let maxGroupId: number = 0; 343048147e0Sopenharmony_ci if (res.code == common.int.SUCCESS) { 344048147e0Sopenharmony_ci maxGroupId = Number(res.abilityResult) + 1; 345048147e0Sopenharmony_ci } else { 346048147e0Sopenharmony_ci HiLog.w(TAG, 'dealInsertMessageDetail, queryMaxGroupId failed'); 347048147e0Sopenharmony_ci callback(res); 348048147e0Sopenharmony_ci } 349048147e0Sopenharmony_ci this.insertMessageDetailByMaxGroupId(param, actionData, threadId, maxGroupId, result => { 350048147e0Sopenharmony_ci callback(result); 351048147e0Sopenharmony_ci }, context); 352048147e0Sopenharmony_ci }, context); 353048147e0Sopenharmony_ci } 354048147e0Sopenharmony_ci 355048147e0Sopenharmony_ci private insertMessageDetailByMaxGroupId(param, actionData, threadId, maxGroupId, callback, context): void { 356048147e0Sopenharmony_ci let count: number = 0; 357048147e0Sopenharmony_ci let initDatas: Array<LooseObject> = []; 358048147e0Sopenharmony_ci let result: LooseObject = {}; 359048147e0Sopenharmony_ci result.groupId = maxGroupId; 360048147e0Sopenharmony_ci let sendResults = actionData.sendResults; 361048147e0Sopenharmony_ci sendResults.forEach(sendResult => { 362048147e0Sopenharmony_ci let valueBucket: LooseObject = this.buildInsertSmsMmsRow(param, actionData, sendResult, threadId, maxGroupId); 363048147e0Sopenharmony_ci this.insertSmsMmsInfo(valueBucket, res => { 364048147e0Sopenharmony_ci count++; 365048147e0Sopenharmony_ci let initData: LooseObject = { 366048147e0Sopenharmony_ci 'id': res.abilityResult, 367048147e0Sopenharmony_ci 'telephone': sendResult.telephone 368048147e0Sopenharmony_ci }; 369048147e0Sopenharmony_ci initDatas.push(initData); 370048147e0Sopenharmony_ci if (count == actionData.sendResults.length) { 371048147e0Sopenharmony_ci result.initDatas = initDatas; 372048147e0Sopenharmony_ci callback(result); 373048147e0Sopenharmony_ci } 374048147e0Sopenharmony_ci }, context); 375048147e0Sopenharmony_ci }); 376048147e0Sopenharmony_ci } 377048147e0Sopenharmony_ci 378048147e0Sopenharmony_ci private buildInsertSmsMmsRow(param, actionData, sendResult, threadId, maxGroupId): LooseObject { 379048147e0Sopenharmony_ci let valueBucket: LooseObject = { 380048147e0Sopenharmony_ci 'slot_id': common.int.SIM_ONE, 381048147e0Sopenharmony_ci 'receiver_number': common.string.EMPTY_STR, 382048147e0Sopenharmony_ci 'sender_number': common.string.EMPTY_STR, 383048147e0Sopenharmony_ci 'start_time': common.string.EMPTY_STR, 384048147e0Sopenharmony_ci 'end_time': common.string.EMPTY_STR, 385048147e0Sopenharmony_ci 'msg_type': common.MESSAGE_TYPE.NORMAL, 386048147e0Sopenharmony_ci 'sms_type': common.sms_type.COMMON, 387048147e0Sopenharmony_ci 'msg_title': common.string.EMPTY_STR, 388048147e0Sopenharmony_ci 'msg_content': common.string.EMPTY_STR, 389048147e0Sopenharmony_ci 'msg_state': common.int.SEND_MESSAGE_SENDING, 390048147e0Sopenharmony_ci 'operator_service_number': common.string.EMPTY_STR, 391048147e0Sopenharmony_ci 'msg_code': common.string.EMPTY_STR, 392048147e0Sopenharmony_ci 'session_id': threadId, 393048147e0Sopenharmony_ci 'is_lock': common.is_lock.NO, 394048147e0Sopenharmony_ci 'is_read': common.is_read.UN_READ, 395048147e0Sopenharmony_ci 'is_collect': common.is_collect.NOT_FAVORITE, 396048147e0Sopenharmony_ci 'session_type': common.session_type.COMMON, 397048147e0Sopenharmony_ci 'is_sender': common.is_sender.NO, 398048147e0Sopenharmony_ci 'group_id': maxGroupId, 399048147e0Sopenharmony_ci 'is_send_report': common.is_send_report.NO 400048147e0Sopenharmony_ci }; 401048147e0Sopenharmony_ci if (sendResult.slotId != null) { 402048147e0Sopenharmony_ci valueBucket.slot_id = sendResult.slotId; 403048147e0Sopenharmony_ci } 404048147e0Sopenharmony_ci if (actionData.isReceive) { 405048147e0Sopenharmony_ci valueBucket.receiver_number = actionData.ownNumber ? actionData.ownNumber : common.string.EMPTY_STR; 406048147e0Sopenharmony_ci valueBucket.sender_number = sendResult.telephone ? sendResult.telephone : common.string.EMPTY_STR; 407048147e0Sopenharmony_ci valueBucket.is_read = common.is_read.UN_READ; 408048147e0Sopenharmony_ci } else { 409048147e0Sopenharmony_ci valueBucket.receiver_number = sendResult.telephone ? sendResult.telephone : common.string.EMPTY_STR; 410048147e0Sopenharmony_ci valueBucket.sender_number = actionData.ownNumber ? actionData.ownNumber : common.string.EMPTY_STR; 411048147e0Sopenharmony_ci valueBucket.is_read = common.is_read.READ; 412048147e0Sopenharmony_ci } 413048147e0Sopenharmony_ci let time: string = sendResult.time; 414048147e0Sopenharmony_ci if (time == null) { 415048147e0Sopenharmony_ci time = new Date().getTime() + common.string.EMPTY_STR; 416048147e0Sopenharmony_ci } 417048147e0Sopenharmony_ci valueBucket.start_time = time; 418048147e0Sopenharmony_ci valueBucket.end_time = time; 419048147e0Sopenharmony_ci if (param.isMms != null && param.isMms) { 420048147e0Sopenharmony_ci valueBucket.msg_type = common.MESSAGE_TYPE.THEME; 421048147e0Sopenharmony_ci } 422048147e0Sopenharmony_ci if (param.smsType != null) { 423048147e0Sopenharmony_ci valueBucket.sms_type = param.smsType; 424048147e0Sopenharmony_ci } 425048147e0Sopenharmony_ci if (param.content != null) { 426048147e0Sopenharmony_ci valueBucket.msg_title = param.content; 427048147e0Sopenharmony_ci valueBucket.msg_content = param.content; 428048147e0Sopenharmony_ci } 429048147e0Sopenharmony_ci if (sendResult.sendStatus != null) { 430048147e0Sopenharmony_ci valueBucket.msg_state = sendResult.sendStatus; 431048147e0Sopenharmony_ci } 432048147e0Sopenharmony_ci if (actionData.isSender != null) { 433048147e0Sopenharmony_ci valueBucket.is_sender = actionData.isSender; 434048147e0Sopenharmony_ci } 435048147e0Sopenharmony_ci if (actionData.hasReport != null) { 436048147e0Sopenharmony_ci valueBucket.is_send_report = actionData.hasReport; 437048147e0Sopenharmony_ci } 438048147e0Sopenharmony_ci return valueBucket; 439048147e0Sopenharmony_ci } 440048147e0Sopenharmony_ci 441048147e0Sopenharmony_ci public dealSendResults(sendResults: Array<LooseObject>): LooseObject { 442048147e0Sopenharmony_ci let contactsNum: number = sendResults.length; 443048147e0Sopenharmony_ci let telephone: string = common.string.EMPTY_STR; 444048147e0Sopenharmony_ci let content: string = common.string.EMPTY_STR; 445048147e0Sopenharmony_ci let sendStatus: number = common.int.SEND_MESSAGE_SUCCESS; 446048147e0Sopenharmony_ci let failSum: number = 0; 447048147e0Sopenharmony_ci let time: string = common.string.EMPTY_STR; 448048147e0Sopenharmony_ci for (let sendResult of sendResults) { 449048147e0Sopenharmony_ci telephone = telephone + sendResult.telephone + common.string.COMMA; 450048147e0Sopenharmony_ci content = sendResult.content; 451048147e0Sopenharmony_ci sendStatus = sendResult.sendStatus; 452048147e0Sopenharmony_ci if (sendResult.sendStatus == common.int.SEND_MESSAGE_FAILED) { 453048147e0Sopenharmony_ci failSum++; 454048147e0Sopenharmony_ci } 455048147e0Sopenharmony_ci if (sendResult.time != null) { 456048147e0Sopenharmony_ci time = sendResult.time; 457048147e0Sopenharmony_ci } 458048147e0Sopenharmony_ci if (sendResult.isMessageSim != null && sendResult.isMessageSim) { 459048147e0Sopenharmony_ci telephone = sendResult.telephone; 460048147e0Sopenharmony_ci contactsNum = 1; 461048147e0Sopenharmony_ci } 462048147e0Sopenharmony_ci } 463048147e0Sopenharmony_ci // If it fails, then the session list turns out to be a failure. 464048147e0Sopenharmony_ci if (failSum > 0) { 465048147e0Sopenharmony_ci sendStatus = common.int.SEND_MESSAGE_FAILED; 466048147e0Sopenharmony_ci } 467048147e0Sopenharmony_ci telephone = telephone.substring(0, telephone.length - 1); 468048147e0Sopenharmony_ci let smsType: number = common.sms_type.COMMON; 469048147e0Sopenharmony_ci if (contactsNum == 1 && telephoneUtils.judgeIsInfoMsg(telephone)) { 470048147e0Sopenharmony_ci smsType = common.sms_type.NOTICE; 471048147e0Sopenharmony_ci } 472048147e0Sopenharmony_ci let result: LooseObject = {}; 473048147e0Sopenharmony_ci let timestamp: number = new Date().getTime(); 474048147e0Sopenharmony_ci result.contactsNum = contactsNum; 475048147e0Sopenharmony_ci result.content = content; 476048147e0Sopenharmony_ci result.telephone = telephoneUtils.dealTelephoneSort(telephone); 477048147e0Sopenharmony_ci result.sendStatus = sendStatus; 478048147e0Sopenharmony_ci result.timestamp = time != common.string.EMPTY_STR ? time : timestamp; 479048147e0Sopenharmony_ci result.smsType = smsType; 480048147e0Sopenharmony_ci return result; 481048147e0Sopenharmony_ci } 482048147e0Sopenharmony_ci 483048147e0Sopenharmony_ci public updateSessionAndDetail(actionData): void { 484048147e0Sopenharmony_ci let sendResults: Array<LooseObject> = actionData.sendResults; 485048147e0Sopenharmony_ci if (sendResults.length == 0) { 486048147e0Sopenharmony_ci return; 487048147e0Sopenharmony_ci } 488048147e0Sopenharmony_ci let param: LooseObject = this.dealSendResults(sendResults); 489048147e0Sopenharmony_ci // Update the status of the session list. 490048147e0Sopenharmony_ci let valueBucket: LooseObject = { 491048147e0Sopenharmony_ci 'sending_status': param.sendStatus, 492048147e0Sopenharmony_ci 'content': param.content 493048147e0Sopenharmony_ci } 494048147e0Sopenharmony_ci ConversationListService.getInstance().updateSessionByCondition(actionData, valueBucket, null, null); 495048147e0Sopenharmony_ci // Update the status of the information list. 496048147e0Sopenharmony_ci for (let sendResult of sendResults) { 497048147e0Sopenharmony_ci actionData.sendStatus = sendResult.sendStatus; 498048147e0Sopenharmony_ci if (sendResult.sendStatus == common.int.SEND_MESSAGE_FAILED) { 499048147e0Sopenharmony_ci actionData.sendStatus = common.int.SEND_MESSAGE_FAILED; 500048147e0Sopenharmony_ci } else if (sendResult.sendStatus == common.int.SEND_MESSAGE_SUCCESS) { 501048147e0Sopenharmony_ci actionData.sendStatus = common.int.SEND_MESSAGE_SUCCESS; 502048147e0Sopenharmony_ci } else { 503048147e0Sopenharmony_ci actionData.sendStatus = common.int.SEND_MESSAGE_SENDING; 504048147e0Sopenharmony_ci } 505048147e0Sopenharmony_ci actionData.msgId = sendResult.id; 506048147e0Sopenharmony_ci let valueBucket: LooseObject = { 507048147e0Sopenharmony_ci 'msg_state': actionData.sendStatus, 508048147e0Sopenharmony_ci }; 509048147e0Sopenharmony_ci this.updateSmsMmsInfoByCondition(actionData, valueBucket, null, null); 510048147e0Sopenharmony_ci } 511048147e0Sopenharmony_ci } 512048147e0Sopenharmony_ci 513048147e0Sopenharmony_ci public saveImage(actionData, callback, context): void { 514048147e0Sopenharmony_ci callback('saveImage function to be developed!'); 515048147e0Sopenharmony_ci } 516048147e0Sopenharmony_ci 517048147e0Sopenharmony_ci public gotoShare(actionData, callback, context): void { 518048147e0Sopenharmony_ci callback('gotoShare function to be developed!'); 519048147e0Sopenharmony_ci } 520048147e0Sopenharmony_ci 521048147e0Sopenharmony_ci public dealContactsName(telephones, actionData, resultList, callback, context): void { 522048147e0Sopenharmony_ci actionData.telephones = telephones; 523048147e0Sopenharmony_ci actionData.hasDelete = '0'; 524048147e0Sopenharmony_ci if (telephones.length == 0) { 525048147e0Sopenharmony_ci callback(resultList); 526048147e0Sopenharmony_ci } 527048147e0Sopenharmony_ci ContactsService.getInstance().queryContactDataByCondition(actionData, res => { 528048147e0Sopenharmony_ci let groupIdMap: LooseObject = {}; 529048147e0Sopenharmony_ci if (res.code == common.int.FAILURE || res.abilityResult.length == 0) { 530048147e0Sopenharmony_ci groupIdMap = this.convertingMessageByGroup(resultList); 531048147e0Sopenharmony_ci } else { 532048147e0Sopenharmony_ci // Convert the result to Map, key: mobile number, value: name 533048147e0Sopenharmony_ci let telephoneMap = new Map(); 534048147e0Sopenharmony_ci let contacts: Array<LooseObject> = res.abilityResult; 535048147e0Sopenharmony_ci for (let item of contacts) { 536048147e0Sopenharmony_ci if (item.displayName == common.string.EMPTY_STR) { 537048147e0Sopenharmony_ci telephoneMap.set(item.detailInfo, item.detailInfo); 538048147e0Sopenharmony_ci } else { 539048147e0Sopenharmony_ci telephoneMap.set(item.detailInfo, item.displayName); 540048147e0Sopenharmony_ci } 541048147e0Sopenharmony_ci } 542048147e0Sopenharmony_ci // Match the result based on the mobile number. 543048147e0Sopenharmony_ci groupIdMap = this.getGroupIdMap(resultList, telephoneMap); 544048147e0Sopenharmony_ci } 545048147e0Sopenharmony_ci let lists = []; 546048147e0Sopenharmony_ci let favoriteList = []; 547048147e0Sopenharmony_ci for (let key of Object.keys(groupIdMap)) { 548048147e0Sopenharmony_ci let value = groupIdMap[key]; 549048147e0Sopenharmony_ci let contactsNums = value.telephone.split(common.string.COMMA); 550048147e0Sopenharmony_ci value.contactsNum = contactsNums.length; 551048147e0Sopenharmony_ci if (value.isFavorite) { 552048147e0Sopenharmony_ci let temp = JSON.parse(JSON.stringify(value)); 553048147e0Sopenharmony_ci temp.icon = '/common/icon/icon_favorite.svg'; 554048147e0Sopenharmony_ci favoriteList.push(temp); 555048147e0Sopenharmony_ci value.isFavorite = false; 556048147e0Sopenharmony_ci } 557048147e0Sopenharmony_ci lists.push(value); 558048147e0Sopenharmony_ci } 559048147e0Sopenharmony_ci // Add favorite data to the search list. 560048147e0Sopenharmony_ci if (favoriteList.length > 0) { 561048147e0Sopenharmony_ci lists = lists.concat(favoriteList); 562048147e0Sopenharmony_ci } 563048147e0Sopenharmony_ci callback(lists); 564048147e0Sopenharmony_ci }, context); 565048147e0Sopenharmony_ci } 566048147e0Sopenharmony_ci 567048147e0Sopenharmony_ci public getGroupIdMap(resultList, telephoneMap): LooseObject { 568048147e0Sopenharmony_ci let groupIdMap: LooseObject = {}; 569048147e0Sopenharmony_ci for (let map of resultList) { 570048147e0Sopenharmony_ci // Indicates the combination of multiple names. The names need to be displayed in combination. 571048147e0Sopenharmony_ci if (telephoneMap.has(map.telephone)) { 572048147e0Sopenharmony_ci map.name = telephoneMap.get(map.telephone); 573048147e0Sopenharmony_ci map.nameFormatter = map.name + '<' + map.telephoneFormat + '>'; 574048147e0Sopenharmony_ci } else { 575048147e0Sopenharmony_ci map.nameFormatter = map.telephoneFormat; 576048147e0Sopenharmony_ci } 577048147e0Sopenharmony_ci if (Object.keys(groupIdMap).indexOf(map.groupId) > -1) { 578048147e0Sopenharmony_ci let list = groupIdMap[map.groupId]; 579048147e0Sopenharmony_ci list.name = list.name + common.string.COMMA + map.name; 580048147e0Sopenharmony_ci list.nameFormatter = list.nameFormatter + common.string.COMMA + map.nameFormatter; 581048147e0Sopenharmony_ci list.telephone = list.telephone + common.string.COMMA + map.telephone; 582048147e0Sopenharmony_ci list.telephoneFormat = list.telephoneFormat + common.string.COMMA + map.telephoneFormat; 583048147e0Sopenharmony_ci } else { 584048147e0Sopenharmony_ci groupIdMap[map.groupId] = map; 585048147e0Sopenharmony_ci } 586048147e0Sopenharmony_ci } 587048147e0Sopenharmony_ci return groupIdMap; 588048147e0Sopenharmony_ci } 589048147e0Sopenharmony_ci 590048147e0Sopenharmony_ci public convertingMessageByGroup(resultList): LooseObject { 591048147e0Sopenharmony_ci let groupIdMap: LooseObject = {}; 592048147e0Sopenharmony_ci for (let element of resultList) { 593048147e0Sopenharmony_ci if (Object.keys(groupIdMap).indexOf(element.groupId) == -1) { 594048147e0Sopenharmony_ci groupIdMap[element.groupId] = element; 595048147e0Sopenharmony_ci } 596048147e0Sopenharmony_ci } 597048147e0Sopenharmony_ci return groupIdMap; 598048147e0Sopenharmony_ci } 599048147e0Sopenharmony_ci 600048147e0Sopenharmony_ci public statisticsUnreadNotify(callback, context): void { 601048147e0Sopenharmony_ci let actionData: LooseObject = {}; 602048147e0Sopenharmony_ci actionData.hasRead = common.is_read.UN_READ; 603048147e0Sopenharmony_ci actionData.smsType = common.sms_type.NOTICE; 604048147e0Sopenharmony_ci this.querySmsMmsInfoSizeByCondition(actionData, res => { 605048147e0Sopenharmony_ci if (res.code == common.int.SUCCESS) { 606048147e0Sopenharmony_ci callback(res.abilityResult); 607048147e0Sopenharmony_ci } else { 608048147e0Sopenharmony_ci HiLog.w(TAG, 'statisticsUnreadNotify fail!'); 609048147e0Sopenharmony_ci callback(0); 610048147e0Sopenharmony_ci } 611048147e0Sopenharmony_ci }, context); 612048147e0Sopenharmony_ci } 613048147e0Sopenharmony_ci}