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 dataShare from '@ohos.data.dataShare'; 16import dataSharePredicates from '@ohos.data.dataSharePredicates'; 17 18import BaseModel from './BaseModel'; 19import common from '../data/commonData'; 20import HiLog from '../utils/HiLog'; 21import mmsTable from '../data/tableData'; 22import LooseObject from '../data/LooseObject' 23 24const TAG = 'ContactsModel'; 25 26export default class ContactsModel extends BaseModel { 27 public async queryContactDataByCondition(actionData, callback, context): Promise<void> { 28 let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS); 29 let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactDataCondition(actionData); 30 let contactDataUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_DATA_URI; 31 dataHelper.query(contactDataUri, condition, this.buildContactDataTablePartColumns()).then(resultSet => { 32 let resultList: Array<LooseObject> = []; 33 if (resultSet.rowCount > 0) { 34 while (resultSet.goToNextRow()) { 35 resultList.push(this.buildContactDataResult(resultSet)); 36 } 37 } 38 callback(this.encapsulateReturnResult(common.int.SUCCESS, resultList)); 39 resultSet.close(); 40 }).catch(error => { 41 HiLog.e(TAG, 'queryContactDataByCondition fail, error: ' + JSON.stringify(error)); 42 callback(this.encapsulateReturnCode(common.int.FAILURE)); 43 }); 44 } 45 46 public async queryContactDataSizeByCondition(actionData, callback, context): Promise<void> { 47 let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS); 48 let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactDataCondition(actionData); 49 let contactDataUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_DATA_URI; 50 dataHelper.query(contactDataUri, condition, this.buildContactDataTablePartColumns()).then(resultSet => { 51 callback(this.encapsulateReturnResult(common.int.SUCCESS, resultSet.rowCount)); 52 resultSet.close(); 53 }).catch(error => { 54 HiLog.e(TAG, 'queryContactDataSizeByCondition fail, error: ' + JSON.stringify(error)); 55 callback(this.encapsulateReturnCode(common.int.FAILURE)); 56 }); 57 } 58 59 public async queryContactByCondition(actionData, callback, context): Promise<void> { 60 let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS); 61 let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactCondition(actionData); 62 let contactUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_URI; 63 dataHelper.query(contactUri, condition, this.buildContactTablePartColumns()).then(resultSet => { 64 let resultList: Array<LooseObject> = []; 65 if (resultSet.rowCount > 0) { 66 while (resultSet.goToNextRow()) { 67 resultList.push(this.buildContactResult(resultSet)); 68 } 69 } 70 callback(this.encapsulateReturnResult(common.int.SUCCESS, resultList)); 71 resultSet.close(); 72 }).catch(error => { 73 HiLog.e(TAG, 'queryContactByCondition fail, error: ' + JSON.stringify(error)); 74 callback(this.encapsulateReturnCode(common.int.FAILURE)); 75 }); 76 } 77 78 public async queryContactSizeByCondition(actionData, callback, context): Promise<void> { 79 let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS); 80 let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactCondition(actionData); 81 let contactUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_URI; 82 dataHelper.query(contactUri, condition, this.buildContactTablePartColumns()).then(resultSet => { 83 callback(this.encapsulateReturnResult(common.int.SUCCESS, resultSet.rowCount)); 84 resultSet.close(); 85 }).catch(error => { 86 HiLog.e(TAG, 'queryContactSizeByCondition fail, error: ' + JSON.stringify(error)); 87 callback(this.encapsulateReturnCode(common.int.FAILURE)); 88 }); 89 } 90 91 public async queryRawContactSizeByCondition(actionData, callback, context): Promise<void> { 92 let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS); 93 let condition: dataSharePredicates.DataSharePredicates = this.buildQueryRawContactCondition(actionData); 94 let rawContactUri: string = common.string.URI_ROW_CONTACTS + common.string.PROFILE_DATA_URI; 95 dataHelper.query(rawContactUri, condition, this.buildRawContactTablePartColumns()).then(resultSet => { 96 callback(this.encapsulateReturnResult(common.int.SUCCESS, resultSet.rowCount)); 97 resultSet.close(); 98 }).catch(error => { 99 HiLog.e(TAG, 'queryRawContactSizeByCondition fail, error: ' + JSON.stringify(error)); 100 callback(this.encapsulateReturnCode(common.int.FAILURE)); 101 }); 102 } 103 104 public async queryContactViewByCondition(actionData, callback, context): Promise<void> { 105 let dataHelper = await dataShare.createDataShareHelper(context, common.string.URI_ROW_CONTACTS); 106 let condition: dataSharePredicates.DataSharePredicates = this.buildQueryContactViewCondition(actionData); 107 let searchContactViewUri: string = common.string.URI_ROW_CONTACTS + common.string.CONTACT_SEARCHE; 108 dataHelper.query(searchContactViewUri, condition, this.buildRawContactViewPartColumns()).then(resultSet => { 109 let resultList: Array<LooseObject> = []; 110 if (resultSet.rowCount > 0) { 111 while (resultSet.goToNextRow()) { 112 resultList.push(this.buildContactViewResult(resultSet)); 113 } 114 } 115 callback(this.encapsulateReturnResult(common.int.SUCCESS, resultList)); 116 resultSet.close(); 117 }).catch(error => { 118 HiLog.e(TAG, 'queryContactViewByCondition fail, error: ' + JSON.stringify(error)); 119 callback(this.encapsulateReturnCode(common.int.FAILURE)); 120 }); 121 } 122 123 private buildContactDataTablePartColumns(): Array<string> { 124 // part of contact_data table columns 125 return [ 126 mmsTable.contactDataColumns.detailInfo, 127 mmsTable.contactDataColumns.displayName, 128 ]; 129 } 130 131 private buildContactTablePartColumns(): Array<string> { 132 // part of contact table columns 133 return [ 134 mmsTable.contactColumns.id 135 ]; 136 } 137 138 private buildRawContactTablePartColumns(): Array<string> { 139 // part of raw_contact table columns 140 return [ 141 mmsTable.contactDataColumns.id 142 ]; 143 } 144 145 private buildRawContactViewPartColumns(): Array<string> { 146 // part of contact view table columns 147 return [ 148 mmsTable.searchContactView.detailInfo, 149 mmsTable.searchContactView.displayName 150 ]; 151 } 152 153 private buildContactDataResult(resultSet): LooseObject { 154 let result: LooseObject = {}; 155 result.detailInfo = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.detailInfo)); 156 result.displayName = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.displayName)); 157 return result; 158 } 159 160 private buildContactResult(resultSet): LooseObject { 161 let result: LooseObject = {}; 162 result.id = Number(resultSet.getString(resultSet.getColumnIndex(mmsTable.contactColumns.id))); 163 return result; 164 } 165 166 private buildContactViewResult(resultSet): LooseObject { 167 let result: LooseObject = {}; 168 result.detailInfo = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.detailInfo)); 169 result.displayName = resultSet.getString(resultSet.getColumnIndex(mmsTable.contactDataColumns.displayName)); 170 return result; 171 } 172 173 private buildQueryContactDataCondition(actionData): dataSharePredicates.DataSharePredicates { 174 let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 175 condition.equalTo(mmsTable.contactDataColumns.typeId, '5'); 176 if (actionData.hasDelete != null) { 177 condition.and().equalTo(mmsTable.contactDataColumns.hasDelete, actionData.hasDelete); 178 } 179 if (actionData.contactIds != null && actionData.contactIds.length > 0) { 180 condition.and().in(mmsTable.contactDataColumns.contactId, actionData.contactIds); 181 } 182 if (actionData.telephones != null && actionData.telephones.length > 0) { 183 condition.and().in(mmsTable.contactDataColumns.detailInfo, actionData.telephones); 184 } 185 return condition; 186 } 187 188 private buildQueryContactCondition(actionData): dataSharePredicates.DataSharePredicates { 189 let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 190 condition.isNotNull(mmsTable.contactColumns.id); 191 if (actionData.page != null && actionData.limit != null) { 192 let offset: number = (actionData.page - 1) * actionData.limit; 193 condition.and().limit(actionData.limit, offset); 194 } 195 if (actionData.telephone != null) { 196 condition.and() 197 .equalTo(mmsTable.searchContactView.contentType, 'phone') 198 .beginWrap() 199 .contains(mmsTable.searchContactView.displayName, actionData.telephone) 200 .or() 201 .contains(mmsTable.searchContactView.detailInfo, actionData.telephone) 202 .endWrap(); 203 } 204 if (actionData.orderByTimeDesc != null) { 205 condition.orderByDesc(mmsTable.contactColumns.lastestContactedTime); 206 } 207 return condition; 208 } 209 210 private buildQueryRawContactCondition(actionData): dataSharePredicates.DataSharePredicates { 211 let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 212 return condition; 213 } 214 215 private buildQueryContactViewCondition(actionData): dataSharePredicates.DataSharePredicates { 216 let condition: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 217 condition.equalTo(mmsTable.searchContactView.contentType, 'phone') 218 .beginWrap() 219 .contains(mmsTable.searchContactView.displayName, actionData.telephone) 220 .or() 221 .contains(mmsTable.searchContactView.detailInfo, actionData.telephone) 222 .endWrap(); 223 return condition; 224 } 225}