• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}