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