1/**
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15import WantAgent from '@ohos.app.ability.wantAgent';
16import Notification from '@ohos.notificationManager';
17
18import common from '../data/commonData';
19import HiLog from '../utils/HiLog';
20import ConversationService from './ConversationService';
21import ConversationListService from '../service/ConversationListService';
22
23var notificationManager = globalThis.requireNapi('notificationManager');
24const label = 'notification_';
25const TAG: string = 'NotificationService';
26
27export default class NotificationService {
28    private static sInstance: NotificationService;
29
30    static getInstance() {
31        if (NotificationService.sInstance == null) {
32            NotificationService.sInstance = new NotificationService();
33        }
34        return NotificationService.sInstance;
35    }
36
37    constructor() {
38        HiLog.i(TAG, 'new start');
39    }
40
41    /**
42     * Send Notifications
43     *
44     * @param actionData
45     */
46    sendNotify(actionData) {
47        // Creating Want Information
48        let wantAgentInfo = this.buildWantAgentInfo(actionData);
49        // Constructing a Send Request
50        let notificationRequest = this.buildNotificationRequest(actionData);
51        this.getWantAgent(wantAgentInfo, (data) => {
52            notificationRequest.wantAgent = data;
53            notificationRequest.id = actionData.msgId;
54            notificationRequest.label = label + actionData.msgId;
55            Notification.publish(notificationRequest);
56            HiLog.i(TAG, 'sendNotify finished');
57        });
58    }
59
60    /**
61     * Create a wanted message to be sent.
62     *
63     * @param agentInfo
64     * @callback callback
65     */
66    getWantAgent(agentInfo, callback) {
67        WantAgent.getWantAgent(agentInfo).then(data1 => {
68            callback(data1);
69        });
70    }
71
72    /**
73     * Constructing distributed startup parameters
74     *
75     * @param actionData
76     */
77    buildWantAgentInfo(actionData): any {
78        let parameters = {
79            pageFlag: 'conversation',
80            contactObjects: actionData.contactObjects
81        };
82        let wantAgentInfo = {
83            wants: [
84                {
85                    deviceId: '',
86                    bundleName: common.string.BUNDLE_NAME,
87                    abilityName: common.string.ABILITY_NAME,
88                    action: 'mms.event.notification',
89                    entities: [],
90                    type: 'MIMETYPE',
91                    uri: '',
92                }
93            ],
94            operationType: WantAgent.OperationType.START_ABILITY,
95            requestCode: actionData.msgId,
96            wantAgentFlags: [WantAgent.WantAgentFlags.CONSTANT_FLAG],
97            extraInfo: parameters
98        };
99        return wantAgentInfo;
100    }
101
102    /**
103     * Building notification parameters
104     *
105     * @param actionData
106     */
107    buildNotificationRequest(actionData): any {
108        let message = actionData.message;
109        let notificationRequest = {
110            content: {
111                contentType: Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
112                normal: {
113                    title: message.title,
114                    text: message.text
115                },
116            },
117            wantAgent: undefined,
118            slotType: Notification.SlotType.OTHER_TYPES,
119            deliveryTime: new Date().getTime(),
120            groupName: 'MMS'
121        };
122        return notificationRequest;
123    }
124
125    cancelMessageNotify(actionData, callback?) {
126        ConversationService.getInstance().queryMessageDetail(actionData, res => {
127            if (res.code == common.int.FAILURE || res.response.length == 0) {
128                if (callback != null) {
129                    callback(common.int.FAILURE);
130                }
131            }
132            let count = 0;
133            for (let item of res.response) {
134                this.cancelNotify(Number(item.id), result => {
135                    count++;
136                    if (count == res.response.length && callback != null) {
137                        callback(common.int.SUCCESS);
138                    }
139                });
140            }
141        }, null);
142    }
143
144    cancelNotify(msgId, callback) {
145        Notification.cancel(msgId, label + msgId, (err, data) => {
146            if (err) {
147                HiLog.w(TAG, 'cancelNotify, error: ' + JSON.stringify(err.message));
148                callback(common.int.FAILURE);
149            }
150            callback(common.int.SUCCESS);
151        });
152    }
153
154    cancelAllNotify() {
155        let promise = Notification.cancelAll();
156        promise.then((ret) => {
157        }).catch((err) => {
158            HiLog.e(TAG, 'cancelAllNotify, error: ' + JSON.stringify(err.message));
159        });
160    }
161
162    public setBadgeNumber(unreadTotal: number): void {
163        notificationManager.setBadgeNumber(unreadTotal);
164    }
165
166    public updateBadgeNumber(context?): void {
167        ConversationListService.getInstance().statisticalData(res => {
168            if (res.code == common.int.SUCCESS) {
169                this.setBadgeNumber(Number(res.response.totalListCount));
170            }
171        }, context);
172    }
173};