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 */ 15 16import BaseModel from "./BaseModel"; 17import common from "../data/commonData"; 18import mmsTable from "../data/tableData"; 19import HiLog from "../utils/HiLog"; 20import LooseObject from "../data/LooseObject" 21import MmsDatabaseHelper from "../utils/MmsDatabaseHelper"; 22import ohosDataRdb from "@ohos.data.rdb"; 23 24import dataShare from "@ohos.data.dataShare"; 25import dataSharePredicates from "@ohos.data.dataSharePredicates"; 26 27const TAG = "ConversationListModel"; 28 29export default class ConversationListModel extends BaseModel { 30 async querySessionList(actionData) { 31 let predicates = new ohosDataRdb.RdbPredicates(MmsDatabaseHelper.TABLE.SESSION); 32 let numberType = actionData.numberType; 33 if (numberType != null) { 34 await predicates.equalTo(mmsTable.sessionField.smsType, numberType); 35 } 36 await predicates.orderByDesc(mmsTable.sessionField.time); 37 await predicates.limitAs(actionData.limit); 38 let offset = actionData.page < 3 ? (actionData.page - 1) * 50 : (actionData.page - 2) * 100 + 50; 39 await predicates.offsetAs(offset); 40 let resultSet = await globalThis.MmsDatabaseHelper.query(predicates); 41 let sessionList = []; 42 if (resultSet != undefined) { 43 while (resultSet.goToNextRow()) { 44 let item = await this.buildResultSet(resultSet); 45 sessionList.push(item); 46 } 47 } 48 let result = { 49 response: sessionList, 50 } 51 return result; 52 } 53 54 async querySessionByTelephone(telephone) { 55 HiLog.i(TAG, "query session by telephone") 56 let predicates = new ohosDataRdb.RdbPredicates(MmsDatabaseHelper.TABLE.SESSION); 57 if (telephone) { 58 await predicates.equalTo(mmsTable.sessionField.telephone, telephone); 59 } 60 61 let resultSet = await globalThis.MmsDatabaseHelper.query(predicates); 62 if(resultSet === null) { 63 return null; 64 } 65 resultSet.goToFirstRow(); 66 let result = await this.buildResultSet(resultSet); 67 return result; 68 } 69 70 async querySessionById(threadId) { 71 let predicates = new ohosDataRdb.RdbPredicates(MmsDatabaseHelper.TABLE.SESSION); 72 if (threadId) { 73 await predicates.equalTo(mmsTable.sessionField.id, threadId); 74 } 75 let resultSet = await globalThis.MmsDatabaseHelper.query(predicates); 76 resultSet.goToFirstRow(); 77 let result = await this.buildResultSet(resultSet); 78 return result; 79 } 80 81 async searchSessionByTelephone(telephone, numberType) { 82 let predicates = new ohosDataRdb.RdbPredicates(MmsDatabaseHelper.TABLE.SESSION); 83 if (telephone != common.string.EMPTY_STR) { 84 await predicates.like(mmsTable.sessionField.telephone, "%" + telephone + "%"); 85 } 86 if (numberType != null) { 87 await predicates.equalTo(mmsTable.sessionField.smsType, numberType); 88 } 89 let resultSet = await globalThis.MmsDatabaseHelper.query(predicates); 90 let sessionList = []; 91 if (resultSet != undefined) { 92 while (resultSet.goToNextRow()) { 93 let item = await this.buildResultSet(resultSet); 94 sessionList.push(item); 95 } 96 } 97 return sessionList; 98 } 99 100 async buildResultSet(resultSet) { 101 let result: LooseObject = {}; 102 result.id = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.id))); 103 result.time = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.time))); 104 result.hasDraft = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.hasDraft))); 105 result.smsType = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.smsType))); 106 result.telephone = await resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.telephone)); 107 result.content = await resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.content)); 108 result.contactsNum = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.contactsNum))); 109 result.unreadCount = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.unreadCount))); 110 result.messageCount = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.messageCount))); 111 result.hasMms = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.hasMms))); 112 result.sendStatus = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.sendStatus))); 113 result.hasAttachment = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.hasAttachment))); 114 result.hasLock = await Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.sessionField.hasLock))); 115 result.telephoneFormat = result.telephone; 116 return result; 117 } 118 119 async countSessionList(actionData) { 120 let predicates = new ohosDataRdb.RdbPredicates(MmsDatabaseHelper.TABLE.SESSION); 121 let numberType = actionData.numberType; 122 if (numberType != null) { 123 await predicates.equalTo(mmsTable.sessionField.smsType, numberType); 124 } 125 let resultSet = await globalThis.MmsDatabaseHelper.query(predicates); 126 let count = resultSet.rowCount; 127 let result = { 128 total: count, 129 } 130 return result; 131 } 132 133 async statisticalData(actionData, callback) { 134 let mmsContext; 135 if (actionData.mmsContext) { 136 mmsContext = actionData.mmsContext; 137 } else { 138 mmsContext = globalThis.mmsContext; 139 } 140 let resultColumns = [ 141 "totalListCount", 142 "unreadCount", 143 "unreadTotalOfInfo" 144 ]; 145 let condition = new dataSharePredicates.DataSharePredicates(); 146 let managerUri = common.string.URI_MESSAGE_LOG + common.string.URI_MESSAGE_UNREAD_COUNT; 147 let dataShareHelper = await dataShare.createDataShareHelper(mmsContext, common.string.URI_MESSAGE_LOG); 148 dataShareHelper.query(managerUri, condition, resultColumns, (err, resultSet) => { 149 let result: LooseObject = {}; 150 if (resultSet != undefined) { 151 if (resultSet.goToLastRow()) { 152 result.totalListCount = resultSet.getString(0); 153 result.unreadCount = resultSet.getString(1); 154 result.unreadTotalOfInfo = resultSet.getString(2); 155 } 156 } 157 callback(this.encapsulateReturnResult(common.int.SUCCESS, result)); 158 }); 159 } 160 161 async markAllAsRead(threadIds, valueBucket) { 162 HiLog.i(TAG, "markAllAsRead, threadIds:" + JSON.stringify(threadIds)); 163 this.updateById(threadIds, valueBucket); 164 } 165 166 async markAllToRead(smsType) { 167 let predicates = new ohosDataRdb.RdbPredicates(MmsDatabaseHelper.TABLE.SESSION); 168 predicates.equalTo(mmsTable.sessionField.smsType, smsType); 169 predicates.greaterThan(mmsTable.sessionField.unreadCount, 0); 170 let valueBucket = { 171 "unread_count": 0 172 }; 173 globalThis.MmsDatabaseHelper.update(predicates, valueBucket); 174 } 175 176 async updateById(threadIds, valueBucket) { 177 HiLog.i(TAG, ", updateById, threadIds: " + JSON.stringify(threadIds)) 178 if (threadIds.length != 0) { 179 for (let threadId of threadIds) { 180 let predicates = new ohosDataRdb.RdbPredicates(MmsDatabaseHelper.TABLE.SESSION); 181 await predicates.equalTo(mmsTable.sessionField.id, threadId); 182 globalThis.MmsDatabaseHelper.update(predicates, valueBucket); 183 HiLog.d(TAG, ", update session TAB end") 184 } 185 } 186 } 187 188 async deleteMessageById(threadIds) { 189 HiLog.i(TAG, "deleteMessageById, threadIds: " + JSON.stringify(threadIds)); 190 if (threadIds.length != 0) { 191 for (let threadId of threadIds) { 192 let predicates = new ohosDataRdb.RdbPredicates(MmsDatabaseHelper.TABLE.SESSION); 193 await predicates.equalTo(mmsTable.sessionField.id, threadId); 194 globalThis.MmsDatabaseHelper.deleteItem(predicates); 195 HiLog.d(TAG, ", delete session TAB end") 196 } 197 } 198 } 199 200 insertSession(valueBucket, callback) { 201 let insertPromise = globalThis.MmsDatabaseHelper.insert(MmsDatabaseHelper.TABLE.SESSION, valueBucket); 202 let result: LooseObject = {}; 203 insertPromise.then((ret) => { 204 result.code = common.int.SUCCESS; 205 result.rowId = ret; 206 callback(result); 207 }).catch((err) => { 208 HiLog.e(TAG, "insertSession, error: " + JSON.stringify(err.message)); 209 result.code = common.int.FAILURE; 210 callback(result); 211 }); 212 } 213}