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}