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 { HiLog } from '../../../../../../common/src/main/ets/util/HiLog'; 16import { StringUtil } from '../../../../../../common/src/main/ets/util/StringUtil'; 17import audio from '@ohos.multimedia.audio'; 18import router from '@ohos.router'; 19import observer from '@ohos.telephony.observer'; 20import PreferencesUtil from '../../util/PreferencesUtil'; 21import { PhoneNumber } from '../../../../../../feature/phonenumber/src/main/ets/PhoneNumber'; 22import IndexPresenter from '../IndexPresenter'; 23 24const TAG = 'DialerPresenter'; 25 26/** 27 * dialer presenter 28 */ 29export default class DialerPresenter { 30 private static mPresenter: DialerPresenter; 31 private _isCallStateChangeObserved = false; 32 readonly NUM_TEXT_MAX_LENGTH = 20; 33 readonly NUM_TEXT_MAXSIZE_LENGTH = 14; 34 readonly NUM_TEXT_FONT_SIZE_MAX = 38; 35 private timer: any = null; 36 panelShow: boolean = false; 37 btnShow: boolean = true; 38 isClickDelete: boolean = false; 39 isEmergencyNum: boolean = false; 40 tele_number: string = ""; 41 tele_num_size: number = this.NUM_TEXT_FONT_SIZE_MAX; 42 all_number: string = ""; 43 call_p: number = 134; 44 call_y: number = 6; 45 moveY: number = 336; 46 dialerButtonWidth = 48; 47 dialerButtonHeight = 48; 48 dialerRadius = 24; 49 refreshView: boolean; 50 callBtnClick: boolean; 51 52 static getInstance() { 53 if (this.mPresenter == null) { 54 this.mPresenter = new DialerPresenter(); 55 } 56 return this.mPresenter; 57 } 58 59 aboutToAppear() { 60 if (!PreferencesUtil.isUsed() && !this._isCallStateChangeObserved) { 61 observer.on('callStateChange', (callback: { 62 state, 63 number, 64 }) => { 65 HiLog.i(TAG, 'callStateChange state' + callback.state); 66 if (callback.state === 0) { 67 HiLog.i(TAG, "callback.state:" + callback.state); 68 this.refresh(); 69 } 70 }); 71 this._isCallStateChangeObserved = true; 72 } 73 } 74 75 refresh() { 76 if (!PreferencesUtil.isUsed()) { 77 PreferencesUtil.setIsUsed(true); 78 this.refreshView = !this.refreshView; 79 } 80 } 81 82 editPhoneNumber(phoneNum): void { 83 if (StringUtil.isEmpty(phoneNum) || this.isClickDelete) { 84 this.isClickDelete = false; 85 return; 86 } 87 AppStorage.SetOrCreate("tele_number", phoneNum); 88 this.all_number = phoneNum; 89 this.viewNumberTextProc(); 90 this.deleteAddSpace(); 91 } 92 93 onDestroy() { 94 } 95 96 /* 97 * Change the font size when deleting a number. 98 */ 99 deleteTeleNum() { 100 let number: string = AppStorage.Get("tele_number"); 101 if (this.all_number.length < this.NUM_TEXT_MAX_LENGTH) { 102 AppStorage.SetOrCreate("tele_number", this.all_number); 103 } else { 104 AppStorage.SetOrCreate("tele_number", this.all_number.substr(this.all_number.length - this.NUM_TEXT_MAX_LENGTH)); 105 } 106 if (number.length > this.NUM_TEXT_MAXSIZE_LENGTH) { 107 this.tele_num_size = this.NUM_TEXT_FONT_SIZE_MAX * this.NUM_TEXT_MAXSIZE_LENGTH / number.length; 108 } else if (number.length <= this.NUM_TEXT_MAXSIZE_LENGTH) { 109 this.tele_num_size = this.NUM_TEXT_FONT_SIZE_MAX; 110 } 111 } 112 113 /* 114 * Add formatting spaces when deleting a number. 115 */ 116 deleteAddSpace() { 117 let number: string = AppStorage.Get("tele_number"); 118 let teleNumberNoSpace = StringUtil.removeSpace(number); 119 this.all_number = StringUtil.removeSpace(this.all_number); 120 if (teleNumberNoSpace.length > this.NUM_TEXT_MAXSIZE_LENGTH - 2) { 121 AppStorage.SetOrCreate("tele_number", teleNumberNoSpace); 122 return; 123 } 124 if (this.checkNeedNumberSpace(number)) { 125 if (teleNumberNoSpace.length <= 3) { 126 AppStorage.SetOrCreate("tele_number", teleNumberNoSpace); 127 return; 128 } 129 if (teleNumberNoSpace.length > 3) { 130 let split1 = teleNumberNoSpace.substr(0, 3); 131 let split2 = teleNumberNoSpace.substr(3, teleNumberNoSpace.length - 3); 132 AppStorage.SetOrCreate("tele_number", split1 + ' ' + split2); 133 if (teleNumberNoSpace.length > 7) { 134 split2 = teleNumberNoSpace.substr(3, 4); 135 let split3 = teleNumberNoSpace.substr(7, teleNumberNoSpace.length - 7); 136 AppStorage.SetOrCreate("tele_number", split1 + ' ' + split2 + ' ' + split3); 137 } 138 } 139 } else { 140 if (teleNumberNoSpace.length > 8) { 141 let split4 = teleNumberNoSpace.substr(0, 8); 142 let split5 = teleNumberNoSpace.substr(8, teleNumberNoSpace.length - 8); 143 AppStorage.SetOrCreate("tele_number", split4 + ' ' + split5); 144 } 145 } 146 } 147 148 /* 149 * Check whether formatting spaces are required when entering a number. 150 */ 151 checkNeedNumberSpace(numText) { 152 let isSpace = /[\+;,#\*]/g; 153 let isRule = /^\+.*/; 154 if (isSpace.test(numText)) { 155 // If the number string contains special characters, no space is added. 156 if (isRule.test(numText)) { 157 return true; 158 } else { 159 return false; 160 } 161 } 162 return true; 163 } 164 165 dialing(phoneNumber, options?: any) { 166 IndexPresenter.getInstance().editPhoneNumber = ""; 167 PhoneNumber.fromString(phoneNumber).dial(options).then((rst) => { 168 this.refresh(); 169 }); 170 } 171 172 /* 173 * Key vibration 174 */ 175 pressVibrate() { 176 } 177 178 /* 179 * Add a space when entering a number. 180 */ 181 ifNeedSpace() { 182 let needNumber: string = AppStorage.Get("tele_number"); 183 switch (needNumber.length) { 184 case 3: 185 if (this.checkNeedNumberSpace(needNumber)) { 186 AppStorage.SetOrCreate("tele_number", needNumber + ' '); 187 } 188 break; 189 case 8: 190 AppStorage.SetOrCreate("tele_number", needNumber + ' '); 191 break; 192 default: 193 break; 194 } 195 } 196 197 /* 198 * Processing of Overlong Input Numbers 199 */ 200 viewNumberTextProc() { 201 let numStringNoSpace_all = StringUtil.removeSpace(this.all_number); 202 let number: string = AppStorage.Get("tele_number"); 203 AppStorage.SetOrCreate("tele_number", numStringNoSpace_all.length > this.NUM_TEXT_MAX_LENGTH ? 204 numStringNoSpace_all.substr(numStringNoSpace_all.length - this.NUM_TEXT_MAX_LENGTH) : number 205 ); 206 if (number.length > this.NUM_TEXT_MAXSIZE_LENGTH) { 207 AppStorage.SetOrCreate("tele_number", StringUtil.removeSpace(number)); 208 } 209 if (number.length > this.NUM_TEXT_MAXSIZE_LENGTH) { 210 this.tele_num_size = this.NUM_TEXT_FONT_SIZE_MAX * this.NUM_TEXT_MAXSIZE_LENGTH / (number.length); // 可视号码在16-25位时,适配font-size 211 } else { 212 this.tele_num_size = this.NUM_TEXT_FONT_SIZE_MAX; 213 } 214 } 215 216 /* 217 * Play different audio resources based on key digits. 218 */ 219 playAudio(number) { 220 switch (number.toString()) { 221 case '1': 222 this.tonePlayer(1); 223 break; 224 case '2': 225 this.tonePlayer(2); 226 break; 227 case '3': 228 this.tonePlayer(3); 229 break; 230 case '4': 231 this.tonePlayer(4); 232 break; 233 case '5': 234 this.tonePlayer(5); 235 break; 236 case '6': 237 this.tonePlayer(6); 238 break; 239 case '7': 240 this.tonePlayer(7); 241 break; 242 case '8': 243 this.tonePlayer(8); 244 break; 245 case '9': 246 this.tonePlayer(9); 247 break; 248 case '0': 249 this.tonePlayer(0); 250 break; 251 case '*': 252 this.tonePlayer(10); 253 break; 254 case '#': 255 this.tonePlayer(11); 256 break; 257 default: 258 HiLog.e(TAG, "keytone src is error"); 259 } 260 } 261 262 async tonePlayer(type) { 263 HiLog.i(TAG, 'TonePlayer'); 264 if (this.timer) clearTimeout(this.timer); 265 let tonePlayer = null; 266 let audioRendererInfo = { 267 content: 5, 268 usage: 6, 269 rendererFlags: 0 270 }; 271 this.timer = setTimeout(async () => { 272 try { 273 tonePlayer = await audio.createTonePlayer(audioRendererInfo); 274 await tonePlayer.load(type); 275 await tonePlayer.start(); 276 setTimeout(async () => { 277 await tonePlayer.stop(); 278 await tonePlayer.release(); 279 }, 30) 280 } catch (err) { 281 HiLog.e(TAG, 'tonePlayer err = ' + JSON.stringify(err)); 282 } 283 }, 50) 284 }; 285 286 /* 287 * Jump to New Contact 288 */ 289 jumpToAccountants() { 290 router.push({ 291 url: "pages/contacts/accountants/Accountants", 292 params: { 293 updataShow: false, 294 phoneNumbers: [{ 295 phoneNumber: AppStorage.Get("tele_number") 296 }] 297 }, 298 }) 299 } 300 301 sendMessage() { 302 let formatnum = PhoneNumber.fromString(this.all_number).format(); 303 PhoneNumber.fromString(this.all_number).sendMessage(formatnum, formatnum); 304 } 305}