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: notification manager
1899da06d0Sopenharmony_ci */
1999da06d0Sopenharmony_ci
2099da06d0Sopenharmony_ciimport wantAgent from '@ohos.wantAgent';
2199da06d0Sopenharmony_ciimport notification from '@ohos.notification';
2299da06d0Sopenharmony_ciimport commonEvent from '@ohos.commonEvent';
2399da06d0Sopenharmony_ciimport callStateConst from '../common/constant/CallStateConst';
2499da06d0Sopenharmony_ciimport LogUtils from '../common/utils/LogUtils';
2599da06d0Sopenharmony_ciimport * as Constants from '../common/utils/Constants';
2699da06d0Sopenharmony_ci
2799da06d0Sopenharmony_ciconst TAG = 'NotificationManager';
2899da06d0Sopenharmony_ciconst ID = 0;
2999da06d0Sopenharmony_ci
3099da06d0Sopenharmony_ciconst notificationRequest = {
3199da06d0Sopenharmony_ci  content: {
3299da06d0Sopenharmony_ci    contentType: notification.ContentType.NOTIFICATION_CONTENT_LONG_TEXT,
3399da06d0Sopenharmony_ci    longText: {
3499da06d0Sopenharmony_ci      title: '',
3599da06d0Sopenharmony_ci      text: '',
3699da06d0Sopenharmony_ci      longText: '',
3799da06d0Sopenharmony_ci      briefText: '',
3899da06d0Sopenharmony_ci      expandedTitle: ''
3999da06d0Sopenharmony_ci    }
4099da06d0Sopenharmony_ci  },
4199da06d0Sopenharmony_ci  id: ID,
4299da06d0Sopenharmony_ci  wantAgent: null,
4399da06d0Sopenharmony_ci  actionButtons: [],
4499da06d0Sopenharmony_ci  slotType: notification.SlotType.OTHER_TYPES,
4599da06d0Sopenharmony_ci  deliveryTime: new Date().getTime()
4699da06d0Sopenharmony_ci};
4799da06d0Sopenharmony_ci
4899da06d0Sopenharmony_ciconst textMap =
4999da06d0Sopenharmony_ci  {
5099da06d0Sopenharmony_ci    'answer': $r('app.string.answer'),
5199da06d0Sopenharmony_ci    'reject': $r('app.string.reject'),
5299da06d0Sopenharmony_ci    'hangUp': $r('app.string.hangUp'),
5399da06d0Sopenharmony_ci    'mute': $r('app.string.mute'),
5499da06d0Sopenharmony_ci    'callHold': $r('app.string.callHold'),
5599da06d0Sopenharmony_ci  };
5699da06d0Sopenharmony_ci
5799da06d0Sopenharmony_ciexport default class NotificationManager {
5899da06d0Sopenharmony_ci  /**
5999da06d0Sopenharmony_ci   * Send notification
6099da06d0Sopenharmony_ci   *
6199da06d0Sopenharmony_ci   * @param { Object } text - text info
6299da06d0Sopenharmony_ci   *
6399da06d0Sopenharmony_ci   * @param { Object } callData - call data
6499da06d0Sopenharmony_ci   *
6599da06d0Sopenharmony_ci   * @param { FUnction } $t - i18n format
6699da06d0Sopenharmony_ci   */
6799da06d0Sopenharmony_ci  async sendNotification(callData) {
6899da06d0Sopenharmony_ci    const {callState, accountNumber, contactName, callId} = callData;
6999da06d0Sopenharmony_ci    const actionBtnKeys = this.getMapObj(callState) || [];
7099da06d0Sopenharmony_ci    const {START_ABILITY, SEND_COMMON_EVENT} = wantAgent.OperationType;
7199da06d0Sopenharmony_ci    const wantAgentObj = await this.getWantAgent(callData, START_ABILITY);
7299da06d0Sopenharmony_ci    let titleName = ' ';
7399da06d0Sopenharmony_ci    let expandedName = ' ';
7499da06d0Sopenharmony_ci    if (contactName) {
7599da06d0Sopenharmony_ci      titleName = contactName;
7699da06d0Sopenharmony_ci      expandedName = accountNumber;
7799da06d0Sopenharmony_ci    } else {
7899da06d0Sopenharmony_ci      titleName = accountNumber;
7999da06d0Sopenharmony_ci      expandedName = ' ';
8099da06d0Sopenharmony_ci    }
8199da06d0Sopenharmony_ci    notificationRequest.wantAgent = wantAgentObj;
8299da06d0Sopenharmony_ci    notificationRequest.actionButtons = [];
8399da06d0Sopenharmony_ci
8499da06d0Sopenharmony_ci    if (actionBtnKeys.length) {
8599da06d0Sopenharmony_ci      for (const key of actionBtnKeys) {
8699da06d0Sopenharmony_ci        const data = {
8799da06d0Sopenharmony_ci          callId, btnType: key
8899da06d0Sopenharmony_ci        };
8999da06d0Sopenharmony_ci        LogUtils.i(TAG, 'sendNotification getResourceManager key:' + JSON.stringify(key));
9099da06d0Sopenharmony_ci        const wantAgentObj = await this.getWantAgent(data, SEND_COMMON_EVENT);
9199da06d0Sopenharmony_ci        const title = globalThis.calluiAbilityContext?.resourceManager.getStringSync(textMap[key]);
9299da06d0Sopenharmony_ci        LogUtils.i(TAG, 'sendNotification getResourceManager textMap[key].id:' + JSON.stringify(title));
9399da06d0Sopenharmony_ci        notificationRequest.actionButtons.push({
9499da06d0Sopenharmony_ci          title: title,
9599da06d0Sopenharmony_ci          wantAgent: wantAgentObj
9699da06d0Sopenharmony_ci        });
9799da06d0Sopenharmony_ci        LogUtils.i(TAG, 'sendNotification getResourceManager notificationRequest.actionButtons.push:' + JSON.stringify(notificationRequest.actionButtons));
9899da06d0Sopenharmony_ci      }
9999da06d0Sopenharmony_ci    }
10099da06d0Sopenharmony_ci    Object.assign(notificationRequest.content.longText, {
10199da06d0Sopenharmony_ci      title: titleName,
10299da06d0Sopenharmony_ci      text: expandedName,
10399da06d0Sopenharmony_ci      expandedTitle: titleName,
10499da06d0Sopenharmony_ci      longText: expandedName
10599da06d0Sopenharmony_ci    });
10699da06d0Sopenharmony_ci    notification.publish(notificationRequest).then((data) => {
10799da06d0Sopenharmony_ci      LogUtils.i(TAG, 'sendNotification publish success')
10899da06d0Sopenharmony_ci    }).catch((err) => {
10999da06d0Sopenharmony_ci      LogUtils.i(TAG, 'sendNotification public err' + JSON.stringify(err))
11099da06d0Sopenharmony_ci    });
11199da06d0Sopenharmony_ci    LogUtils.i(TAG, 'sendNotification end :')
11299da06d0Sopenharmony_ci  }
11399da06d0Sopenharmony_ci
11499da06d0Sopenharmony_ci  /**
11599da06d0Sopenharmony_ci   * Get call status
11699da06d0Sopenharmony_ci   * @param callState
11799da06d0Sopenharmony_ci   */
11899da06d0Sopenharmony_ci  getMapObj(callState) {
11999da06d0Sopenharmony_ci    if (callState === callStateConst.CALL_STATUS_INCOMING) {
12099da06d0Sopenharmony_ci      return ['answer', 'reject']
12199da06d0Sopenharmony_ci    }
12299da06d0Sopenharmony_ci    if (callState === callStateConst.CALL_STATUS_ACTIVE) {
12399da06d0Sopenharmony_ci      return ['hangUp']
12499da06d0Sopenharmony_ci    }
12599da06d0Sopenharmony_ci    if (callState === callStateConst.CALL_STATUS_HOLDING) {
12699da06d0Sopenharmony_ci      return ['hangUp']
12799da06d0Sopenharmony_ci    }
12899da06d0Sopenharmony_ci    if (callState === callStateConst.CALL_STATUS_ALERTING) {
12999da06d0Sopenharmony_ci      return ['hangUp']
13099da06d0Sopenharmony_ci    }
13199da06d0Sopenharmony_ci    if (callState === callStateConst.CALL_STATUS_DIALING) {
13299da06d0Sopenharmony_ci      return ['hangUp']
13399da06d0Sopenharmony_ci    }
13499da06d0Sopenharmony_ci    if (callState === callStateConst.CALL_STATUS_WAITING) {
13599da06d0Sopenharmony_ci      return ['answer', 'reject']
13699da06d0Sopenharmony_ci    }
13799da06d0Sopenharmony_ci  }
13899da06d0Sopenharmony_ci
13999da06d0Sopenharmony_ci  /**
14099da06d0Sopenharmony_ci   * get want agent
14199da06d0Sopenharmony_ci   *
14299da06d0Sopenharmony_ci   * @param { object } data - call data
14399da06d0Sopenharmony_ci   *
14499da06d0Sopenharmony_ci   * @param { number } operationType - type
14599da06d0Sopenharmony_ci   */
14699da06d0Sopenharmony_ci  getWantAgent(data, operationTypes) {
14799da06d0Sopenharmony_ci    if (!wantAgent) {
14899da06d0Sopenharmony_ci      LogUtils.i(TAG, 'wantAgent is not exist');
14999da06d0Sopenharmony_ci      return;
15099da06d0Sopenharmony_ci    }
15199da06d0Sopenharmony_ci    return wantAgent.getWantAgent({
15299da06d0Sopenharmony_ci      wants: [{
15399da06d0Sopenharmony_ci                deviceId: '',
15499da06d0Sopenharmony_ci                bundleName: Constants.CALL_BUNDLE_NAME,
15599da06d0Sopenharmony_ci                abilityName: Constants.CALL_ABILITY_NAME,
15699da06d0Sopenharmony_ci                uri: '',
15799da06d0Sopenharmony_ci                type: 'phone',
15899da06d0Sopenharmony_ci                action: 'callui.event.click',
15999da06d0Sopenharmony_ci                parameters: data,
16099da06d0Sopenharmony_ci                entities: []
16199da06d0Sopenharmony_ci              }],
16299da06d0Sopenharmony_ci      requestCode: 0,
16399da06d0Sopenharmony_ci      operationType: operationTypes,
16499da06d0Sopenharmony_ci      wantAgentFlags: [wantAgent.WantAgentFlags.ONE_TIME_FLAG]
16599da06d0Sopenharmony_ci    });
16699da06d0Sopenharmony_ci  }
16799da06d0Sopenharmony_ci
16899da06d0Sopenharmony_ci  /**
16999da06d0Sopenharmony_ci   * Cancel notice
17099da06d0Sopenharmony_ci   */
17199da06d0Sopenharmony_ci  cancelNotification() {
17299da06d0Sopenharmony_ci    LogUtils.i(TAG, 'cancelNotification')
17399da06d0Sopenharmony_ci    notification.cancel(ID).then((res) => {
17499da06d0Sopenharmony_ci      LogUtils.i(TAG, 'notify.cancel res data : %s' + JSON.stringify(res))
17599da06d0Sopenharmony_ci    }).catch((err) => {
17699da06d0Sopenharmony_ci      LogUtils.i(TAG, 'notify.cancel err data : %s' + JSON.stringify(err))
17799da06d0Sopenharmony_ci    });
17899da06d0Sopenharmony_ci  }
17999da06d0Sopenharmony_ci
18099da06d0Sopenharmony_ci  /**
18199da06d0Sopenharmony_ci   * send capsule notification
18299da06d0Sopenharmony_ci   *
18399da06d0Sopenharmony_ci   * @param {Object} callData - call data
18499da06d0Sopenharmony_ci   *
18599da06d0Sopenharmony_ci   * @param {boolean} isBackground - is background
18699da06d0Sopenharmony_ci   */
18799da06d0Sopenharmony_ci  sendCapsuleNotification(callData, isBackground) {
18899da06d0Sopenharmony_ci    LogUtils.i(TAG, 'sendCapsuleNotification isBackground : ' + JSON.stringify(isBackground))
18999da06d0Sopenharmony_ci    LogUtils.i(TAG, 'sendCapsuleNotification callData.startTime :')
19099da06d0Sopenharmony_ci    const {callState, startTime} = callData;
19199da06d0Sopenharmony_ci    let commonEventPublishData = {
19299da06d0Sopenharmony_ci      bundleName: 'com.ohos.systemui',
19399da06d0Sopenharmony_ci      isOrdered: false,
19499da06d0Sopenharmony_ci      subscriberPermissions: ['ohos.permission.GET_TELEPHONY_STATE'],
19599da06d0Sopenharmony_ci      data: JSON.stringify({
19699da06d0Sopenharmony_ci        callState,
19799da06d0Sopenharmony_ci        startTime: startTime * 1000,
19899da06d0Sopenharmony_ci        isBackground,
19999da06d0Sopenharmony_ci        wantBundleName: Constants.CALL_BUNDLE_NAME,
20099da06d0Sopenharmony_ci        wantAbilityName: Constants.CALL_ABILITY_NAME
20199da06d0Sopenharmony_ci      })
20299da06d0Sopenharmony_ci    }
20399da06d0Sopenharmony_ci
20499da06d0Sopenharmony_ci    commonEvent.publish('CAPSULE_EVENT_CALL_UI', commonEventPublishData, (err, data) => {
20599da06d0Sopenharmony_ci      if (err) {
20699da06d0Sopenharmony_ci        LogUtils.i(TAG, 'sendCapsuleNotification publish launcher err:' + JSON.stringify(err))
20799da06d0Sopenharmony_ci      } else {
20899da06d0Sopenharmony_ci        LogUtils.i(TAG, 'sendCapsuleNotification publish launcher success:' + JSON.stringify(data))
20999da06d0Sopenharmony_ci      }
21099da06d0Sopenharmony_ci    })
21199da06d0Sopenharmony_ci  }
21299da06d0Sopenharmony_ci}