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}