199da06d0Sopenharmony_ci/**
299da06d0Sopenharmony_ci * Copyright (c) 2023 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_ciimport FuncBtn from './FuncBtn';
1799da06d0Sopenharmony_ciimport InComDialog from './InComDialog';
1899da06d0Sopenharmony_ciimport ImagePathConst from '../constant/ImagePathConst';
1999da06d0Sopenharmony_ciimport CallStateConst from '../constant/CallStateConst';
2099da06d0Sopenharmony_ciimport CallServiceProxy from '../../model/CallServiceProxy';
2199da06d0Sopenharmony_ciimport sms from '@ohos.telephony.sms';
2299da06d0Sopenharmony_ciimport resourceManager from '@ohos.resourceManager';
2399da06d0Sopenharmony_ciimport prompt from '@system.prompt';
2499da06d0Sopenharmony_ciimport LogUtils from '../utils/LogUtils';
2599da06d0Sopenharmony_ciimport DefaultCallData from '../struct/TypeUtils';
2699da06d0Sopenharmony_ciimport CallListStruct from '../struct/CallListStruct'
2799da06d0Sopenharmony_ciimport VibrationAndProximityUtils from '../utils/VibrationAndProximityUtils';
2899da06d0Sopenharmony_ci
2999da06d0Sopenharmony_ciconst TAG = 'IncomingCom';
3099da06d0Sopenharmony_ciconst SMS_REJECTION = `${ImagePathConst.BASE_URL}ic_public_message.svg`;
3199da06d0Sopenharmony_ci
3299da06d0Sopenharmony_ci/**
3399da06d0Sopenharmony_ci * SMS sent successfully
3499da06d0Sopenharmony_ci */
3599da06d0Sopenharmony_ciconst SEND_SMS_SUCCESS = 0;
3699da06d0Sopenharmony_ci
3799da06d0Sopenharmony_ci/**
3899da06d0Sopenharmony_ci * Failed to send SMS for unknown reason
3999da06d0Sopenharmony_ci */
4099da06d0Sopenharmony_ciconst SEND_SMS_FAILURE_UNKNOWN = 1;
4199da06d0Sopenharmony_ci
4299da06d0Sopenharmony_ci/**
4399da06d0Sopenharmony_ci * The wireless module for sending text messages is turned off
4499da06d0Sopenharmony_ci */
4599da06d0Sopenharmony_ciconst SEND_SMS_FAILURE_RADIO_OFF = 2;
4699da06d0Sopenharmony_ci
4799da06d0Sopenharmony_ci/**
4899da06d0Sopenharmony_ci * The network sending the text message is unavailable
4999da06d0Sopenharmony_ci */
5099da06d0Sopenharmony_ciconst SEND_SMS_FAILURE_SERVICE_UNAVAILABLE = 3;
5199da06d0Sopenharmony_ci
5299da06d0Sopenharmony_ci@Component
5399da06d0Sopenharmony_ciexport default struct IncomingCom {
5499da06d0Sopenharmony_ci  @Link callList: Array<CallListStruct>;
5599da06d0Sopenharmony_ci  @Link callData: DefaultCallData;
5699da06d0Sopenharmony_ci  @Link hangup: boolean;
5799da06d0Sopenharmony_ci  private btnList = [];
5899da06d0Sopenharmony_ci  private msgList = [];
5999da06d0Sopenharmony_ci  mCallServiceProxy: CallServiceProxy = null;
6099da06d0Sopenharmony_ci  msgDialogController: CustomDialogController = new CustomDialogController ({
6199da06d0Sopenharmony_ci    builder: InComDialog({
6299da06d0Sopenharmony_ci      cancel: () => {},
6399da06d0Sopenharmony_ci      confirm: (item) => {
6499da06d0Sopenharmony_ci        this.msgItemClick(item);
6599da06d0Sopenharmony_ci      },
6699da06d0Sopenharmony_ci      cancelHandle: () => {},
6799da06d0Sopenharmony_ci      // @ts-ignore
6899da06d0Sopenharmony_ci      list: this.msgList
6999da06d0Sopenharmony_ci    }),
7099da06d0Sopenharmony_ci    cancel: () => {},
7199da06d0Sopenharmony_ci    customStyle: true
7299da06d0Sopenharmony_ci  });
7399da06d0Sopenharmony_ci
7499da06d0Sopenharmony_ci  aboutToAppear() {
7599da06d0Sopenharmony_ci    this.mCallServiceProxy = CallServiceProxy.getInstance();
7699da06d0Sopenharmony_ci    this.getMsgList();
7799da06d0Sopenharmony_ci    this.getBtnList();
7899da06d0Sopenharmony_ci  }
7999da06d0Sopenharmony_ci
8099da06d0Sopenharmony_ci  aboutToDisappear() {
8199da06d0Sopenharmony_ci    this.msgDialogController = null;
8299da06d0Sopenharmony_ci  }
8399da06d0Sopenharmony_ci
8499da06d0Sopenharmony_ci  /**
8599da06d0Sopenharmony_ci   * send Message   slotId : card slot, destinationHost : accountNumber ,content: content
8699da06d0Sopenharmony_ci   *
8799da06d0Sopenharmony_ci   * @param obj
8899da06d0Sopenharmony_ci   */
8999da06d0Sopenharmony_ci  private sendMessage(obj) {
9099da06d0Sopenharmony_ci    let slotId = this.callData.accountId;
9199da06d0Sopenharmony_ci    let destinationHost = this.callData.accountNumber
9299da06d0Sopenharmony_ci    let contactName = this.callData.contactName
9399da06d0Sopenharmony_ci    globalThis.calluiAbilityContext?.resourceManager.getString(obj.msg.id, (err, typeName) => {
9499da06d0Sopenharmony_ci      LogUtils.i(TAG, 'sendMessage');
9599da06d0Sopenharmony_ci      sms.sendMessage({
9699da06d0Sopenharmony_ci        slotId: slotId,
9799da06d0Sopenharmony_ci        destinationHost: destinationHost,
9899da06d0Sopenharmony_ci        content: typeName,
9999da06d0Sopenharmony_ci        sendCallback: (err, sendResult) => {
10099da06d0Sopenharmony_ci          if (err) {
10199da06d0Sopenharmony_ci            return;
10299da06d0Sopenharmony_ci          }
10399da06d0Sopenharmony_ci          if (sendResult.result === SEND_SMS_SUCCESS) {
10499da06d0Sopenharmony_ci            globalThis.calluiAbilityContext?.resourceManager.getString($r('app.string.SMS_Sent')
10599da06d0Sopenharmony_ci              .id, (err, typeName) => {
10699da06d0Sopenharmony_ci              if (err) {
10799da06d0Sopenharmony_ci                return;
10899da06d0Sopenharmony_ci              }
10999da06d0Sopenharmony_ci              prompt.showToast({
11099da06d0Sopenharmony_ci                message: contactName ? typeName + `${contactName}` : typeName + `${destinationHost}`,
11199da06d0Sopenharmony_ci                duration: 2000,
11299da06d0Sopenharmony_ci              });
11399da06d0Sopenharmony_ci            })
11499da06d0Sopenharmony_ci          } else {
11599da06d0Sopenharmony_ci            globalThis.calluiAbilityContext?.resourceManager.getString($r('app.string.message_Failed')
11699da06d0Sopenharmony_ci              .id, (err, typeName) => {
11799da06d0Sopenharmony_ci              if (err) {
11899da06d0Sopenharmony_ci                return;
11999da06d0Sopenharmony_ci              }
12099da06d0Sopenharmony_ci              prompt.showToast({
12199da06d0Sopenharmony_ci                message: typeName,
12299da06d0Sopenharmony_ci                duration: 2000,
12399da06d0Sopenharmony_ci              });
12499da06d0Sopenharmony_ci            })
12599da06d0Sopenharmony_ci          }
12699da06d0Sopenharmony_ci        }
12799da06d0Sopenharmony_ci      });
12899da06d0Sopenharmony_ci    })
12999da06d0Sopenharmony_ci  }
13099da06d0Sopenharmony_ci
13199da06d0Sopenharmony_ci  private getMsgList() {
13299da06d0Sopenharmony_ci    this.msgList = [
13399da06d0Sopenharmony_ci      {
13499da06d0Sopenharmony_ci        id: 1,
13599da06d0Sopenharmony_ci        msg: $r('app.string.backLater')
13699da06d0Sopenharmony_ci      },
13799da06d0Sopenharmony_ci      {
13899da06d0Sopenharmony_ci        id: 2,
13999da06d0Sopenharmony_ci        msg: $r('app.string.answerThePhone')
14099da06d0Sopenharmony_ci      },
14199da06d0Sopenharmony_ci      {
14299da06d0Sopenharmony_ci        id: 3,
14399da06d0Sopenharmony_ci        msg: $r('app.string.contactMeLater')
14499da06d0Sopenharmony_ci      },
14599da06d0Sopenharmony_ci      {
14699da06d0Sopenharmony_ci        id: 4,
14799da06d0Sopenharmony_ci        msg: $r('app.string.beThereSoon')
14899da06d0Sopenharmony_ci      },
14999da06d0Sopenharmony_ci    ];
15099da06d0Sopenharmony_ci  }
15199da06d0Sopenharmony_ci
15299da06d0Sopenharmony_ci  private getBtnList() {
15399da06d0Sopenharmony_ci    this.btnList = [
15499da06d0Sopenharmony_ci      {
15599da06d0Sopenharmony_ci        type: 'msg',
15699da06d0Sopenharmony_ci        iconText: $r('app.string.sms'),
15799da06d0Sopenharmony_ci        iconDefaultUrl: SMS_REJECTION,
15899da06d0Sopenharmony_ci        iconDisableUrl: SMS_REJECTION,
15999da06d0Sopenharmony_ci        isDisable: false
16099da06d0Sopenharmony_ci      },
16199da06d0Sopenharmony_ci    ];
16299da06d0Sopenharmony_ci  }
16399da06d0Sopenharmony_ci
16499da06d0Sopenharmony_ci  /**
16599da06d0Sopenharmony_ci   * Call rejection interface
16699da06d0Sopenharmony_ci   *
16799da06d0Sopenharmony_ci   * @param {string} msg - Send SMS content
16899da06d0Sopenharmony_ci   */
16999da06d0Sopenharmony_ci  private msgItemClick(obj) {
17099da06d0Sopenharmony_ci    LogUtils.i(TAG, 'msgItemClick rejectCall');
17199da06d0Sopenharmony_ci    this.mCallServiceProxy.rejectCall(this.callData.callId, obj.msg);
17299da06d0Sopenharmony_ci    this.sendMessage(obj);
17399da06d0Sopenharmony_ci  }
17499da06d0Sopenharmony_ci
17599da06d0Sopenharmony_ci  /**
17699da06d0Sopenharmony_ci   * Handling interface call hangup and rejection
17799da06d0Sopenharmony_ci   */
17899da06d0Sopenharmony_ci  private async onReject() {
17999da06d0Sopenharmony_ci    if (this.callList.length > 1) {
18099da06d0Sopenharmony_ci      const incomingData = this.callList.find((v) => v.callState === CallStateConst.callStateObj.CALL_STATUS_WAITING ||
18199da06d0Sopenharmony_ci        v.callState === CallStateConst.callStateObj.CALL_STATUS_INCOMING);
18299da06d0Sopenharmony_ci      Object.assign(this.callData, {
18399da06d0Sopenharmony_ci        ...incomingData
18499da06d0Sopenharmony_ci      });
18599da06d0Sopenharmony_ci    }
18699da06d0Sopenharmony_ci    const {callId, callState} = this.callData;
18799da06d0Sopenharmony_ci    if (callState !== CallStateConst.CALL_STATUS_WAITING) {
18899da06d0Sopenharmony_ci      this.mCallServiceProxy.rejectCall(callId);
18999da06d0Sopenharmony_ci      LogUtils.i(TAG, 'onReject this.mCallServiceProxy.rejectCall :');
19099da06d0Sopenharmony_ci    } else {
19199da06d0Sopenharmony_ci      this.mCallServiceProxy.hangUpCall(callId);
19299da06d0Sopenharmony_ci      LogUtils.i(TAG, 'onReject this.mCallServiceProxy.hangUpCall :');
19399da06d0Sopenharmony_ci    }
19499da06d0Sopenharmony_ci    if (this.callList.length === 1) {
19599da06d0Sopenharmony_ci      this.hangup = true;
19699da06d0Sopenharmony_ci      globalThis.calluiAbilityContext?.terminateSelf().then((data) => {
19799da06d0Sopenharmony_ci        LogUtils.i(TAG, 'onReject terminateSelfCallBack');
19899da06d0Sopenharmony_ci      });
19999da06d0Sopenharmony_ci    }
20099da06d0Sopenharmony_ci  }
20199da06d0Sopenharmony_ci
20299da06d0Sopenharmony_ci  /**
20399da06d0Sopenharmony_ci   * Enable the SMS reply pop-up
20499da06d0Sopenharmony_ci   */
20599da06d0Sopenharmony_ci  private btnClick(type) {
20699da06d0Sopenharmony_ci    LogUtils.i(TAG, 'btnClick : %s' + JSON.stringify(type));
20799da06d0Sopenharmony_ci    if (type === 'msg') {
20899da06d0Sopenharmony_ci      this.msgDialogController.open();
20999da06d0Sopenharmony_ci    }
21099da06d0Sopenharmony_ci  }
21199da06d0Sopenharmony_ci
21299da06d0Sopenharmony_ci  /**
21399da06d0Sopenharmony_ci   * Answer the phone interface
21499da06d0Sopenharmony_ci   */
21599da06d0Sopenharmony_ci  private onAnswer() {
21699da06d0Sopenharmony_ci    LogUtils.i(TAG, 'onAnswer :');
21799da06d0Sopenharmony_ci    const incomingData = this.callList.find((v) => v.callState === CallStateConst.callStateObj.CALL_STATUS_WAITING ||
21899da06d0Sopenharmony_ci      v.callState === CallStateConst.callStateObj.CALL_STATUS_INCOMING);
21999da06d0Sopenharmony_ci    if (incomingData !== undefined) {
22099da06d0Sopenharmony_ci      this.mCallServiceProxy.acceptCall(incomingData.callId);
22199da06d0Sopenharmony_ci    } else {
22299da06d0Sopenharmony_ci      this.mCallServiceProxy.acceptCall(this.callData.callId);
22399da06d0Sopenharmony_ci    }
22499da06d0Sopenharmony_ci    VibrationAndProximityUtils.suspendScreen();
22599da06d0Sopenharmony_ci    VibrationAndProximityUtils.stopVibration();
22699da06d0Sopenharmony_ci  }
22799da06d0Sopenharmony_ci
22899da06d0Sopenharmony_ci  build() {
22999da06d0Sopenharmony_ci    GridRow({ columns: { sm: 4, md: 8, lg: 12 }, gutter: 24 }) {
23099da06d0Sopenharmony_ci      GridCol({ span: { sm: 4, md: 6, lg: 6 }, offset: { sm: 0, md: 1, lg: 3 } }) {
23199da06d0Sopenharmony_ci        Column() {
23299da06d0Sopenharmony_ci          Row() {
23399da06d0Sopenharmony_ci            ForEach(this.btnList, (item) => {
23499da06d0Sopenharmony_ci              Column() {
23599da06d0Sopenharmony_ci                FuncBtn({
23699da06d0Sopenharmony_ci                  btnType: item.type,
23799da06d0Sopenharmony_ci                  iconDisableUrl: item.iconDefaultUrl,
23899da06d0Sopenharmony_ci                  iconDefaultUrl: item.iconDefaultUrl,
23999da06d0Sopenharmony_ci                  iconText: item.iconText,
24099da06d0Sopenharmony_ci                  isDisable: item.isDisable,
24199da06d0Sopenharmony_ci                  btnClick: (type) => {
24299da06d0Sopenharmony_ci                    this.btnClick(type)
24399da06d0Sopenharmony_ci                  }
24499da06d0Sopenharmony_ci                })
24599da06d0Sopenharmony_ci              }
24699da06d0Sopenharmony_ci            })
24799da06d0Sopenharmony_ci          }
24899da06d0Sopenharmony_ci          .height(51)
24999da06d0Sopenharmony_ci
25099da06d0Sopenharmony_ci          Row() {
25199da06d0Sopenharmony_ci            Column() {
25299da06d0Sopenharmony_ci              Image($r('app.media.ic_public_ring_off'))
25399da06d0Sopenharmony_ci                .width(56)
25499da06d0Sopenharmony_ci                .height(56)
25599da06d0Sopenharmony_ci                .onClick(() => {
25699da06d0Sopenharmony_ci                  this.onReject()
25799da06d0Sopenharmony_ci                })
25899da06d0Sopenharmony_ci            }.layoutWeight(1)
25999da06d0Sopenharmony_ci
26099da06d0Sopenharmony_ci            Column() {
26199da06d0Sopenharmony_ci              Image($r('app.media.ic_public_answer'))
26299da06d0Sopenharmony_ci                .width(56)
26399da06d0Sopenharmony_ci                .height(56)
26499da06d0Sopenharmony_ci                .onClick(() => {
26599da06d0Sopenharmony_ci                  this.onAnswer()
26699da06d0Sopenharmony_ci                })
26799da06d0Sopenharmony_ci            }.layoutWeight(1)
26899da06d0Sopenharmony_ci          }
26999da06d0Sopenharmony_ci          .margin({ top: 32 })
27099da06d0Sopenharmony_ci        }
27199da06d0Sopenharmony_ci      }
27299da06d0Sopenharmony_ci    }
27399da06d0Sopenharmony_ci    .width('100%')
27499da06d0Sopenharmony_ci    .margin({ left: 24, right: 24 })
27599da06d0Sopenharmony_ci  }
27699da06d0Sopenharmony_ci}
277