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_ciimport Method from '../utils/Method';
1799da06d0Sopenharmony_ciimport FuncBtn from './FuncBtn';
1899da06d0Sopenharmony_ciimport CallStateConst from '../constant/CallStateConst';
1999da06d0Sopenharmony_ciimport CallServiceProxy from '../../model/CallServiceProxy';
2099da06d0Sopenharmony_ciimport Clone from '../utils/Clone';
2199da06d0Sopenharmony_ciimport BtnGroupConfig from '../configs/BtnGroupConfig';
2299da06d0Sopenharmony_ciimport LogUtils from '../utils/LogUtils';
2399da06d0Sopenharmony_ciimport screenLock from '@ohos.screenLock';
2499da06d0Sopenharmony_ciimport DefaultCallData from '../struct/TypeUtils'
2599da06d0Sopenharmony_ciimport CallListStruct from '../struct/CallListStruct'
2699da06d0Sopenharmony_ciimport FunctonBtnVM from '../../viewmodel/FunctonBtnVIewModel';
2799da06d0Sopenharmony_ci
2899da06d0Sopenharmony_ciconst TAG = 'FuncBtnGroup';
2999da06d0Sopenharmony_ci
3099da06d0Sopenharmony_ciclass BtnStruct {
3199da06d0Sopenharmony_ci  public type
3299da06d0Sopenharmony_ci  public iconDisableUrl
3399da06d0Sopenharmony_ci  public iconDefaultUrl
3499da06d0Sopenharmony_ci  public iconActiveUrl
3599da06d0Sopenharmony_ci  public isDisable
3699da06d0Sopenharmony_ci  public isActive
3799da06d0Sopenharmony_ci  public iconText
3899da06d0Sopenharmony_ci}
3999da06d0Sopenharmony_ciconst textMap =
4099da06d0Sopenharmony_ci  {
4199da06d0Sopenharmony_ci    'record': $r('app.string.recording'),
4299da06d0Sopenharmony_ci    'keep': $r('app.string.keep'),
4399da06d0Sopenharmony_ci    'add': $r('app.string.addCall'),
4499da06d0Sopenharmony_ci    'video': $r('app.string.videoCall'),
4599da06d0Sopenharmony_ci    'mute': $r('app.string.mute'),
4699da06d0Sopenharmony_ci    'contact': $r('app.string.contactPerson'),
4799da06d0Sopenharmony_ci    'exchange': $r('app.string.exchange'),
4899da06d0Sopenharmony_ci    'merge': $r('app.string.mergeCall'),
4999da06d0Sopenharmony_ci  };
5099da06d0Sopenharmony_ci
5199da06d0Sopenharmony_ci@Component
5299da06d0Sopenharmony_ciexport default struct FuncBtnGroup {
5399da06d0Sopenharmony_ci  @Link @Watch('updateBtnList') callData: DefaultCallData;
5499da06d0Sopenharmony_ci  @Link @Watch('updateBtnList') callList: Array<CallListStruct>;
5599da06d0Sopenharmony_ci  @State count: number = 0;
5699da06d0Sopenharmony_ci  @State btnList: Array<BtnStruct> = [];
5799da06d0Sopenharmony_ci  @State m: number = 0;
5899da06d0Sopenharmony_ci  @State n: number = 0;
5999da06d0Sopenharmony_ci  @State oldCallState: number = CallStateConst.CALL_STATUS_IDLE;
6099da06d0Sopenharmony_ci  @State mFunctonBtnVM: FunctonBtnVM = FunctonBtnVM.getInstance();
6199da06d0Sopenharmony_ci  private mCallServiceProxy: CallServiceProxy;
6299da06d0Sopenharmony_ci  private mBtnGroupConfig = BtnGroupConfig;
6399da06d0Sopenharmony_ci  private timer: number = null;
6499da06d0Sopenharmony_ci  private mClone: Clone;
6599da06d0Sopenharmony_ci  private btnListCall;
6699da06d0Sopenharmony_ci  private btnListDialing;
6799da06d0Sopenharmony_ci  private btnListMulti;
6899da06d0Sopenharmony_ci
6999da06d0Sopenharmony_ci  aboutToAppear() {
7099da06d0Sopenharmony_ci    this.mClone = Clone.getInstance()
7199da06d0Sopenharmony_ci    this.mCallServiceProxy = CallServiceProxy.getInstance();
7299da06d0Sopenharmony_ci    this.mBtnGroupConfig.btnGroupList.forEach((v) => {
7399da06d0Sopenharmony_ci      v.iconText = textMap[v.type];
7499da06d0Sopenharmony_ci    });
7599da06d0Sopenharmony_ci    this.mBtnGroupConfig.threePartyList.forEach((v) => {
7699da06d0Sopenharmony_ci      v.iconText = textMap[v.type];
7799da06d0Sopenharmony_ci    });
7899da06d0Sopenharmony_ci    this.btnListCall = this.mClone.clone(this.mBtnGroupConfig.btnGroupList);
7999da06d0Sopenharmony_ci    this.getBtnListCall();
8099da06d0Sopenharmony_ci    this.btnList = this.btnListCall;
8199da06d0Sopenharmony_ci    this.getBtnListMulti();
8299da06d0Sopenharmony_ci    this.updateBtnList();
8399da06d0Sopenharmony_ci    LogUtils.i(TAG, 'aboutToAppear :');
8499da06d0Sopenharmony_ci  }
8599da06d0Sopenharmony_ci
8699da06d0Sopenharmony_ci  /**
8799da06d0Sopenharmony_ci   * Switching BtnList Based on CallStatus
8899da06d0Sopenharmony_ci   */
8999da06d0Sopenharmony_ci  updateBtnList() {
9099da06d0Sopenharmony_ci    if (this.callData.callState === CallStateConst.CALL_STATUS_DIALING ||
9199da06d0Sopenharmony_ci      this.callData.callState === CallStateConst.CALL_STATUS_ALERTING) {
9299da06d0Sopenharmony_ci      this.btnList = this.btnListDialing;
9399da06d0Sopenharmony_ci    } else if (this.callList.length > 1) {
9499da06d0Sopenharmony_ci      this.btnList = this.btnListMulti;
9599da06d0Sopenharmony_ci    } else {
9699da06d0Sopenharmony_ci      this.btnList = this.btnListCall;
9799da06d0Sopenharmony_ci    }
9899da06d0Sopenharmony_ci    this.onCallStateChange(this.callData.callState);
9999da06d0Sopenharmony_ci  }
10099da06d0Sopenharmony_ci
10199da06d0Sopenharmony_ci  /**
10299da06d0Sopenharmony_ci   * Get BtnList Based on CallStatus
10399da06d0Sopenharmony_ci   */
10499da06d0Sopenharmony_ci  getBtnListCall() {
10599da06d0Sopenharmony_ci    this.btnListDialing = this.mClone.clone(this.mBtnGroupConfig.btnGroupList);
10699da06d0Sopenharmony_ci    this.btnListDialing[1].isDisable = true
10799da06d0Sopenharmony_ci    this.btnListDialing[2].isDisable = true
10899da06d0Sopenharmony_ci  }
10999da06d0Sopenharmony_ci
11099da06d0Sopenharmony_ci  /**
11199da06d0Sopenharmony_ci   * Get BtnList for Multi Calls
11299da06d0Sopenharmony_ci   */
11399da06d0Sopenharmony_ci  getBtnListMulti() {
11499da06d0Sopenharmony_ci    this.btnListMulti = this.mClone.clone(this.mBtnGroupConfig.btnGroupList);
11599da06d0Sopenharmony_ci    this.btnListMulti[1] = this.mClone.clone(this.mBtnGroupConfig.threePartyList[0]);
11699da06d0Sopenharmony_ci    this.btnListMulti[2] = this.mClone.clone(this.mBtnGroupConfig.threePartyList[1]);
11799da06d0Sopenharmony_ci  }
11899da06d0Sopenharmony_ci
11999da06d0Sopenharmony_ci  /**
12099da06d0Sopenharmony_ci   * update state of group buttons
12199da06d0Sopenharmony_ci   *
12299da06d0Sopenharmony_ci   * @param {Object} callData - call data
12399da06d0Sopenharmony_ci   */
12499da06d0Sopenharmony_ci  onCallStateChange(newVal) {
12599da06d0Sopenharmony_ci    const btnName = ['video', 'record', 'add', 'contact', 'merge'];
12699da06d0Sopenharmony_ci    if (newVal === CallStateConst.CALL_STATUS_ACTIVE || newVal === CallStateConst.CALL_STATUS_HOLDING) {
12799da06d0Sopenharmony_ci      this.btnList.forEach((item) => {
12899da06d0Sopenharmony_ci        if (!Method.includes(btnName, (item.type))) {
12999da06d0Sopenharmony_ci          item.isDisable = false;
13099da06d0Sopenharmony_ci          item.isActive = false;
13199da06d0Sopenharmony_ci        }
13299da06d0Sopenharmony_ci      });
13399da06d0Sopenharmony_ci      if (newVal === CallStateConst.CALL_STATUS_HOLDING) {
13499da06d0Sopenharmony_ci        this.btnList[1].isActive = true;
13599da06d0Sopenharmony_ci        this.btnList[4].isDisable = true;
13699da06d0Sopenharmony_ci      }
13799da06d0Sopenharmony_ci    } else {
13899da06d0Sopenharmony_ci      this.btnList.forEach((item) => {
13999da06d0Sopenharmony_ci        if (item.type === 'contact') {
14099da06d0Sopenharmony_ci          item.isDisable = false;
14199da06d0Sopenharmony_ci        }
14299da06d0Sopenharmony_ci      });
14399da06d0Sopenharmony_ci    }
14499da06d0Sopenharmony_ci  }
14599da06d0Sopenharmony_ci
14699da06d0Sopenharmony_ci  /**
14799da06d0Sopenharmony_ci   * Display the buttons of the button group
14899da06d0Sopenharmony_ci   *
14999da06d0Sopenharmony_ci   * @param {Object} obj - object
15099da06d0Sopenharmony_ci   */
15199da06d0Sopenharmony_ci  btnClick(obj) {
15299da06d0Sopenharmony_ci    LogUtils.i(TAG, 'btnClick get icon type : ' + JSON.stringify(obj));
15399da06d0Sopenharmony_ci    const btnName = ['record', 'video', 'mute'];
15499da06d0Sopenharmony_ci    const type = obj.type;
15599da06d0Sopenharmony_ci    const { callId } = this.callData;
15699da06d0Sopenharmony_ci    if (Method.includes(btnName, type)) {
15799da06d0Sopenharmony_ci      this.btnList.forEach((item) => {
15899da06d0Sopenharmony_ci        if (item.type === type) {
15999da06d0Sopenharmony_ci          item.isActive = !item.isActive;
16099da06d0Sopenharmony_ci        }
16199da06d0Sopenharmony_ci      });
16299da06d0Sopenharmony_ci      if (type === 'record') {
16399da06d0Sopenharmony_ci        if (this.btnList[0].isActive) {
16499da06d0Sopenharmony_ci        } else {
16599da06d0Sopenharmony_ci          this.count = 0;
16699da06d0Sopenharmony_ci          clearInterval(this.timer);
16799da06d0Sopenharmony_ci          this.btnList[0].iconText = $r('app.string.recording');
16899da06d0Sopenharmony_ci        }
16999da06d0Sopenharmony_ci      }
17099da06d0Sopenharmony_ci    }
17199da06d0Sopenharmony_ci
17299da06d0Sopenharmony_ci    switch (type) {
17399da06d0Sopenharmony_ci      case 'record':
17499da06d0Sopenharmony_ci        break;
17599da06d0Sopenharmony_ci      case 'keep':
17699da06d0Sopenharmony_ci        this.keepHandle('keep');
17799da06d0Sopenharmony_ci        break;
17899da06d0Sopenharmony_ci      case 'exchange':
17999da06d0Sopenharmony_ci        LogUtils.i(TAG, 'exchange button clicked, callid: ' + callId);
18099da06d0Sopenharmony_ci        this.callList.forEach((item) => {
18199da06d0Sopenharmony_ci          if (item.callState === CallStateConst.CALL_STATUS_HOLDING) {
18299da06d0Sopenharmony_ci            this.mCallServiceProxy.unHoldCall(item.callId);
18399da06d0Sopenharmony_ci            return;
18499da06d0Sopenharmony_ci          }
18599da06d0Sopenharmony_ci        });
18699da06d0Sopenharmony_ci        break;
18799da06d0Sopenharmony_ci      case 'add':
18899da06d0Sopenharmony_ci        this.startContact('page_flag_dialer')
18999da06d0Sopenharmony_ci        break;
19099da06d0Sopenharmony_ci      case 'video':
19199da06d0Sopenharmony_ci        break;
19299da06d0Sopenharmony_ci      case 'mute':
19399da06d0Sopenharmony_ci        this.muteHandle('mute');
19499da06d0Sopenharmony_ci        break;
19599da06d0Sopenharmony_ci      case 'contact':
19699da06d0Sopenharmony_ci        this.startContact('page_flag_choose_contacts')
19799da06d0Sopenharmony_ci        break;
19899da06d0Sopenharmony_ci      case 'merge':
19999da06d0Sopenharmony_ci        this.mCallServiceProxy.combineConference(callId);
20099da06d0Sopenharmony_ci        break;
20199da06d0Sopenharmony_ci      default:
20299da06d0Sopenharmony_ci        break;
20399da06d0Sopenharmony_ci    }
20499da06d0Sopenharmony_ci  }
20599da06d0Sopenharmony_ci
20699da06d0Sopenharmony_ci  startContact(pageFlag) {
20799da06d0Sopenharmony_ci    if (screenLock.isLocked()) {
20899da06d0Sopenharmony_ci      screenLock.unlock((err, isUnlock) => {
20999da06d0Sopenharmony_ci        if (isUnlock) {
21099da06d0Sopenharmony_ci          this.startContactAbility(pageFlag)
21199da06d0Sopenharmony_ci        } else {
21299da06d0Sopenharmony_ci          LogUtils.i(TAG, 'startContact screen isLocked')
21399da06d0Sopenharmony_ci        }
21499da06d0Sopenharmony_ci      });
21599da06d0Sopenharmony_ci    } else {
21699da06d0Sopenharmony_ci        this.startContactAbility(pageFlag)
21799da06d0Sopenharmony_ci    }
21899da06d0Sopenharmony_ci  }
21999da06d0Sopenharmony_ci
22099da06d0Sopenharmony_ci  startContactAbility(pageFlag) {
22199da06d0Sopenharmony_ci    globalThis.calluiAbilityContext?.startAbility({
22299da06d0Sopenharmony_ci      bundleName: 'com.ohos.contacts',
22399da06d0Sopenharmony_ci      abilityName: 'com.ohos.contacts.MainAbility',
22499da06d0Sopenharmony_ci      parameters: {
22599da06d0Sopenharmony_ci        pageFlag: pageFlag
22699da06d0Sopenharmony_ci      }
22799da06d0Sopenharmony_ci    });
22899da06d0Sopenharmony_ci  }
22999da06d0Sopenharmony_ci
23099da06d0Sopenharmony_ci  /**
23199da06d0Sopenharmony_ci   * Call hold interface
23299da06d0Sopenharmony_ci   *
23399da06d0Sopenharmony_ci   * @param {string} type - Click the hold button
23499da06d0Sopenharmony_ci   */
23599da06d0Sopenharmony_ci  keepHandle(type) {
23699da06d0Sopenharmony_ci    const awaitIsActive = this.btnList.find((v) => v.type === type).isActive;
23799da06d0Sopenharmony_ci    LogUtils.i(TAG, 'keep handle awaitIsActive : ' + !awaitIsActive);
23899da06d0Sopenharmony_ci    !awaitIsActive ? this.mCallServiceProxy.holdCall(this.callData.callId) :
23999da06d0Sopenharmony_ci      this.mCallServiceProxy.unHoldCall(this.callData.callId);
24099da06d0Sopenharmony_ci  }
24199da06d0Sopenharmony_ci
24299da06d0Sopenharmony_ci  /**
24399da06d0Sopenharmony_ci   * Call hold mute
24499da06d0Sopenharmony_ci   *
24599da06d0Sopenharmony_ci   * @param {string} type - Click the hold button
24699da06d0Sopenharmony_ci   */
24799da06d0Sopenharmony_ci  muteHandle(type) {
24899da06d0Sopenharmony_ci    const awaitIsActive = this.btnList.find((v) => v.type === type).isActive;
24999da06d0Sopenharmony_ci    LogUtils.i(TAG, 'mute Handle awaitIsActive : ' + awaitIsActive);
25099da06d0Sopenharmony_ci    awaitIsActive ? this.mCallServiceProxy.setMuted() : this.mCallServiceProxy.cancelMuted();
25199da06d0Sopenharmony_ci  }
25299da06d0Sopenharmony_ci
25399da06d0Sopenharmony_ci  /**
25499da06d0Sopenharmony_ci   * Clear timer
25599da06d0Sopenharmony_ci   */
25699da06d0Sopenharmony_ci  onDestroy() {
25799da06d0Sopenharmony_ci    LogUtils.i(TAG, 'onDestroy');
25899da06d0Sopenharmony_ci    this.timer && clearInterval(this.timer);
25999da06d0Sopenharmony_ci  }
26099da06d0Sopenharmony_ci
26199da06d0Sopenharmony_ci  build() {
26299da06d0Sopenharmony_ci    GridRow({ columns: { sm: 4, md: 8, lg: 12 }, gutter: 0 }) {
26399da06d0Sopenharmony_ci      GridCol({ span: { sm: 4, md: 6, lg: 6 }, offset: { md: 1, lg: 3 } }) {
26499da06d0Sopenharmony_ci        Grid() {
26599da06d0Sopenharmony_ci          ForEach(this.btnList, (item) => {
26699da06d0Sopenharmony_ci            GridItem() {
26799da06d0Sopenharmony_ci              FuncBtn({
26899da06d0Sopenharmony_ci                btnType: item.type,
26999da06d0Sopenharmony_ci                isDisable: item.isDisable,
27099da06d0Sopenharmony_ci                isActive: item.isActive,
27199da06d0Sopenharmony_ci                iconText: item.iconText,
27299da06d0Sopenharmony_ci                iconDisableUrl: item.iconDisableUrl,
27399da06d0Sopenharmony_ci                iconDefaultUrl: item.iconDefaultUrl,
27499da06d0Sopenharmony_ci                iconActiveUrl: item.iconActiveUrl,
27599da06d0Sopenharmony_ci                btnClick: () => {
27699da06d0Sopenharmony_ci                  this.btnClick(item)
27799da06d0Sopenharmony_ci                }
27899da06d0Sopenharmony_ci              })
27999da06d0Sopenharmony_ci            }
28099da06d0Sopenharmony_ci            .height(51.5)
28199da06d0Sopenharmony_ci          })
28299da06d0Sopenharmony_ci        }
28399da06d0Sopenharmony_ci        .columnsGap(24)
28499da06d0Sopenharmony_ci        .rowsGap(29.5)
28599da06d0Sopenharmony_ci        .height(132.5)
28699da06d0Sopenharmony_ci        .columnsTemplate('1fr 1fr 1fr')
28799da06d0Sopenharmony_ci        .rowsTemplate('1fr 1fr')
28899da06d0Sopenharmony_ci      }
28999da06d0Sopenharmony_ci    }
29099da06d0Sopenharmony_ci    .margin(24)
29199da06d0Sopenharmony_ci  }
29299da06d0Sopenharmony_ci}