199da06d0Sopenharmony_ci/**
299da06d0Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
399da06d0Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
499da06d0Sopenharmony_ci * you may not use this file except in compliance with the License.
599da06d0Sopenharmony_ci * You may obtain a copy of the License at
699da06d0Sopenharmony_ci *
799da06d0Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
899da06d0Sopenharmony_ci *
999da06d0Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1099da06d0Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1199da06d0Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1299da06d0Sopenharmony_ci * See the License for the specific language governing permissions and
1399da06d0Sopenharmony_ci * limitations under the License.
1499da06d0Sopenharmony_ci */
1599da06d0Sopenharmony_ci
1699da06d0Sopenharmony_ci/**
1799da06d0Sopenharmony_ci * @file: Header information display component
1899da06d0Sopenharmony_ci */
1999da06d0Sopenharmony_ciimport LogUtils from '../utils/LogUtils';
2099da06d0Sopenharmony_ciimport callStateConst from '../constant/CallStateConst';
2199da06d0Sopenharmony_ciimport Utils from '../utils/utils'
2299da06d0Sopenharmony_ciimport CallUtils from '../utils/CallUtils'
2399da06d0Sopenharmony_ciimport DefaultCallData from '../struct/TypeUtils'
2499da06d0Sopenharmony_ciimport CallListStruct from '../struct/CallListStruct'
2599da06d0Sopenharmony_ciimport CallTimeListStruct from '../struct/CallTimeListStruct'
2699da06d0Sopenharmony_ci
2799da06d0Sopenharmony_ciconst TAG = 'contactCard';
2899da06d0Sopenharmony_ci
2999da06d0Sopenharmony_ci@Component
3099da06d0Sopenharmony_ciexport default struct ContactCard {
3199da06d0Sopenharmony_ci  @State callStateText: string = '';
3299da06d0Sopenharmony_ci  @State dialing: string = '.';
3399da06d0Sopenharmony_ci  @Prop isShowKeyboard: boolean;
3499da06d0Sopenharmony_ci  @Link callList: Array<CallListStruct>;
3599da06d0Sopenharmony_ci  @Link callData: DefaultCallData;
3699da06d0Sopenharmony_ci  @StorageLink('TextInput') textInput: string = '';
3799da06d0Sopenharmony_ci  @StorageLink('TextInputValue') textInputValue: string = '';
3899da06d0Sopenharmony_ci  @StorageLink('CallTimeList') callTimeList: Array<CallTimeListStruct> = [];
3999da06d0Sopenharmony_ci  @StorageLink('AccountNumber') accountNumber: string = '';
4099da06d0Sopenharmony_ci  @StorageLink('IsEmergencyPhoneNumber') isEmergencyPhoneNumber: boolean = false;
4199da06d0Sopenharmony_ci  @StorageLink('hasSimCard1') hasSimCard1: boolean = false;
4299da06d0Sopenharmony_ci  @StorageLink('hasSimCard2') hasSimCard2: boolean = false;
4399da06d0Sopenharmony_ci  private mUtils: Utils;
4499da06d0Sopenharmony_ci  private timer;
4599da06d0Sopenharmony_ci  private emergency = $r('app.string.emergency');
4699da06d0Sopenharmony_ci
4799da06d0Sopenharmony_ci  public aboutToAppear(): void {
4899da06d0Sopenharmony_ci    LogUtils.i(TAG, 'aboutToAppear');
4999da06d0Sopenharmony_ci    this.mUtils = Utils.getInstance();
5099da06d0Sopenharmony_ci    this.timer = setInterval(() => {
5199da06d0Sopenharmony_ci      if (this.dialing === '...') {
5299da06d0Sopenharmony_ci        this.dialing = '';
5399da06d0Sopenharmony_ci      }
5499da06d0Sopenharmony_ci      this.dialing += '.';
5599da06d0Sopenharmony_ci    }, 500)
5699da06d0Sopenharmony_ci    if (this.callData.callState === 3) {
5799da06d0Sopenharmony_ci      clearInterval(this.timer)
5899da06d0Sopenharmony_ci    }
5999da06d0Sopenharmony_ci    if (this.callData.callState === 4) {
6099da06d0Sopenharmony_ci      CallUtils.hasSimeCard(0);
6199da06d0Sopenharmony_ci      CallUtils.hasSimeCard(1);
6299da06d0Sopenharmony_ci    }
6399da06d0Sopenharmony_ci  }
6499da06d0Sopenharmony_ci
6599da06d0Sopenharmony_ci  /**
6699da06d0Sopenharmony_ci   * Determine whether to display the call list or the input box
6799da06d0Sopenharmony_ci   *
6899da06d0Sopenharmony_ci   * @return {boolean} - return success true fail false
6999da06d0Sopenharmony_ci   */
7099da06d0Sopenharmony_ci  private isShowCard() {
7199da06d0Sopenharmony_ci    return this.callList.length === 1 || (this.callList.length > 1 && this.callList.some((v) =>
7299da06d0Sopenharmony_ci    v.callState === callStateConst.CALL_STATUS_WAITING));
7399da06d0Sopenharmony_ci  }
7499da06d0Sopenharmony_ci
7599da06d0Sopenharmony_ci  /**
7699da06d0Sopenharmony_ci   * Call status
7799da06d0Sopenharmony_ci   *
7899da06d0Sopenharmony_ci   * @return {number} - Call status
7999da06d0Sopenharmony_ci   */
8099da06d0Sopenharmony_ci  public callState() {
8199da06d0Sopenharmony_ci    return this.callData.callState;
8299da06d0Sopenharmony_ci  }
8399da06d0Sopenharmony_ci
8499da06d0Sopenharmony_ci  /**
8599da06d0Sopenharmony_ci   * Whether to display the time
8699da06d0Sopenharmony_ci   *
8799da06d0Sopenharmony_ci   * @return {boolean} - return success true fail false
8899da06d0Sopenharmony_ci   */
8999da06d0Sopenharmony_ci  private isShowTime() {
9099da06d0Sopenharmony_ci    return this.callState() === callStateConst.CALL_STATUS_ACTIVE && this.callList.length === 1;
9199da06d0Sopenharmony_ci  }
9299da06d0Sopenharmony_ci
9399da06d0Sopenharmony_ci  private isShowSim() {
9499da06d0Sopenharmony_ci    return this.callState() === callStateConst.CALL_STATUS_INCOMING && this.hasSimCard1 && this.hasSimCard2;
9599da06d0Sopenharmony_ci  }
9699da06d0Sopenharmony_ci
9799da06d0Sopenharmony_ci  build() {
9899da06d0Sopenharmony_ci    GridRow({ columns: { sm: 4, md: 8, lg: 12 }, gutter: 24 }) {
9999da06d0Sopenharmony_ci      GridCol({ span: { sm: 4, md: 6, lg: 6 }, offset: { md: 1, lg: 3 } }) {
10099da06d0Sopenharmony_ci        Column() {
10199da06d0Sopenharmony_ci          if (!this.isShowKeyboard) {
10299da06d0Sopenharmony_ci            Image($r('app.media.ic_public_avatar'))
10399da06d0Sopenharmony_ci              .width(110)
10499da06d0Sopenharmony_ci              .height(110)
10599da06d0Sopenharmony_ci              .borderRadius(55)
10699da06d0Sopenharmony_ci              .margin({ bottom: 18 })
10799da06d0Sopenharmony_ci          }
10899da06d0Sopenharmony_ci
10999da06d0Sopenharmony_ci          if (this.isShowKeyboard && this.textInput.length === 0) {
11099da06d0Sopenharmony_ci            Text(this.callData.contactName ? this.callData.contactName : this.callData.accountNumber)
11199da06d0Sopenharmony_ci              .fontSize(30)
11299da06d0Sopenharmony_ci              .height(40)
11399da06d0Sopenharmony_ci              .lineHeight(40)
11499da06d0Sopenharmony_ci              .fontWeight(FontWeight.Medium)
11599da06d0Sopenharmony_ci              .fontColor('#FFFFFF')
11699da06d0Sopenharmony_ci              .margin({ bottom: 8 })
11799da06d0Sopenharmony_ci              .maxLines(1)
11899da06d0Sopenharmony_ci              .textOverflow({ overflow: TextOverflow.Ellipsis })
11999da06d0Sopenharmony_ci          } else if (!this.isShowKeyboard) {
12099da06d0Sopenharmony_ci            Text(this.isEmergencyPhoneNumber ? this.emergency : this.callData.contactName ?
12199da06d0Sopenharmony_ci              this.callData.contactName : this.callData.accountNumber)
12299da06d0Sopenharmony_ci              .fontSize(30)
12399da06d0Sopenharmony_ci              .height(40)
12499da06d0Sopenharmony_ci              .lineHeight(40)
12599da06d0Sopenharmony_ci              .fontWeight(FontWeight.Medium)
12699da06d0Sopenharmony_ci              .fontColor('#FFFFFF')
12799da06d0Sopenharmony_ci              .margin({ bottom: 8 })
12899da06d0Sopenharmony_ci              .maxLines(1)
12999da06d0Sopenharmony_ci              .textOverflow({ overflow: TextOverflow.Ellipsis })
13099da06d0Sopenharmony_ci          } else if (this.isShowKeyboard && this.textInput.length != 0) {
13199da06d0Sopenharmony_ci            Scroll() {
13299da06d0Sopenharmony_ci              Text(this.textInputValue)
13399da06d0Sopenharmony_ci                .height(40)
13499da06d0Sopenharmony_ci                .fontSize(30)
13599da06d0Sopenharmony_ci                .lineHeight(40)
13699da06d0Sopenharmony_ci                .fontWeight(FontWeight.Medium)
13799da06d0Sopenharmony_ci                .margin({ bottom: 8 })
13899da06d0Sopenharmony_ci                .fontColor('#FFFFFF')
13999da06d0Sopenharmony_ci                .onTouch((event: TouchEvent) => {
14099da06d0Sopenharmony_ci                  if (event.type === TouchType.Move) {
14199da06d0Sopenharmony_ci                    this.textInputValue = this.textInput
14299da06d0Sopenharmony_ci                  }
14399da06d0Sopenharmony_ci                })
14499da06d0Sopenharmony_ci            }
14599da06d0Sopenharmony_ci            .scrollable(ScrollDirection.Horizontal)
14699da06d0Sopenharmony_ci            .scrollBar(BarState.Off)
14799da06d0Sopenharmony_ci            .width('100%')
14899da06d0Sopenharmony_ci          }
14999da06d0Sopenharmony_ci
15099da06d0Sopenharmony_ci          Row() {
15199da06d0Sopenharmony_ci            if (!this.isShowKeyboard || this.isShowKeyboard && this.textInput.length === 0) {
15299da06d0Sopenharmony_ci              Text((this.callData.contactName || this.isEmergencyPhoneNumber) ? this.callData.accountNumber : '')
15399da06d0Sopenharmony_ci                .fontSize(14)
15499da06d0Sopenharmony_ci                .height(19)
15599da06d0Sopenharmony_ci                .lineHeight(16)
15699da06d0Sopenharmony_ci                .fontColor('#FFFFFF')
15799da06d0Sopenharmony_ci                .margin({ bottom: 8 })
15899da06d0Sopenharmony_ci                .visibility((this.callData.contactName || this.isEmergencyPhoneNumber) && !this.isShowKeyboard ?
15999da06d0Sopenharmony_ci                  Visibility.Visible : Visibility.None)
16099da06d0Sopenharmony_ci            }
16199da06d0Sopenharmony_ci          }
16299da06d0Sopenharmony_ci
16399da06d0Sopenharmony_ci          if (this.callData.callState === 1) {
16499da06d0Sopenharmony_ci            Row() {
16599da06d0Sopenharmony_ci              Text($r('app.string.callHold'))
16699da06d0Sopenharmony_ci                .fontSize(14)
16799da06d0Sopenharmony_ci                .height(19)
16899da06d0Sopenharmony_ci                .lineHeight(19)
16999da06d0Sopenharmony_ci                .fontColor('#FFFFFF')
17099da06d0Sopenharmony_ci                .fontWeight(FontWeight.Medium)
17199da06d0Sopenharmony_ci            }
17299da06d0Sopenharmony_ci          }
17399da06d0Sopenharmony_ci
17499da06d0Sopenharmony_ci          if (this.callData.callState === 2) {
17599da06d0Sopenharmony_ci            Row() {
17699da06d0Sopenharmony_ci              Text($r('app.string.dialing'))
17799da06d0Sopenharmony_ci                .fontSize(14)
17899da06d0Sopenharmony_ci                .height(19)
17999da06d0Sopenharmony_ci                .lineHeight(16)
18099da06d0Sopenharmony_ci                .fontColor('#FFFFFF')
18199da06d0Sopenharmony_ci                .align(Alignment.Start)
18299da06d0Sopenharmony_ci
18399da06d0Sopenharmony_ci              Text(this.dialing)
18499da06d0Sopenharmony_ci                .fontColor('#FFFFFF')
18599da06d0Sopenharmony_ci            }
18699da06d0Sopenharmony_ci            .width(60)
18799da06d0Sopenharmony_ci          }
18899da06d0Sopenharmony_ci
18999da06d0Sopenharmony_ci          if (this.callData.callState === 3) {
19099da06d0Sopenharmony_ci            Text($r('app.string.partyIsRinging'))
19199da06d0Sopenharmony_ci              .fontSize(14)
19299da06d0Sopenharmony_ci              .height(19)
19399da06d0Sopenharmony_ci              .lineHeight(16)
19499da06d0Sopenharmony_ci              .fontColor('#FFFFFF')
19599da06d0Sopenharmony_ci          }
19699da06d0Sopenharmony_ci
19799da06d0Sopenharmony_ci          if (this.isShowSim()) {
19899da06d0Sopenharmony_ci            Image(this.callData.accountId == 1 ? $r('app.media.ic_public_phone_sim2') :
19999da06d0Sopenharmony_ci              $r('app.media.ic_public_phone_sim1'))
20099da06d0Sopenharmony_ci              .margin({ right: 4 })
20199da06d0Sopenharmony_ci              .width(12)
20299da06d0Sopenharmony_ci              .height(12)
20399da06d0Sopenharmony_ci              .opacity(0.6)
20499da06d0Sopenharmony_ci          }
20599da06d0Sopenharmony_ci
20699da06d0Sopenharmony_ci          if (this.isShowTime()) {
20799da06d0Sopenharmony_ci            Row() {
20899da06d0Sopenharmony_ci              if (this.callData.callType === 1) {
20999da06d0Sopenharmony_ci                Image($r('app.media.ic_public_phone_HD'))
21099da06d0Sopenharmony_ci                  .margin({ right: 4 })
21199da06d0Sopenharmony_ci                  .width(12)
21299da06d0Sopenharmony_ci                  .height(12)
21399da06d0Sopenharmony_ci                  .opacity(0.6)
21499da06d0Sopenharmony_ci              }
21599da06d0Sopenharmony_ci
21699da06d0Sopenharmony_ci              Text(this.callTimeList[0]?.callTime)
21799da06d0Sopenharmony_ci                .fontSize(14)
21899da06d0Sopenharmony_ci                .height(19)
21999da06d0Sopenharmony_ci                .lineHeight(19)
22099da06d0Sopenharmony_ci                .fontColor('#FFFFFF')
22199da06d0Sopenharmony_ci            }
22299da06d0Sopenharmony_ci          }
22399da06d0Sopenharmony_ci        }
22499da06d0Sopenharmony_ci      }
22599da06d0Sopenharmony_ci    }
22699da06d0Sopenharmony_ci    .margin({ left: 24, right: 24 })
22799da06d0Sopenharmony_ci  }
22899da06d0Sopenharmony_ci}