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 Notification from '@ohos.notification';
16import { NotificationSubscriber } from 'notification/notificationSubscriber';
17import { Log, AppModel, BadgeManager } from '@ohos/common';
18
19const TAG = 'NumBadgeManager';
20
21export class NumBadgeManager {
22    private readonly mRegisterNumBadgeCallback;
23    private readonly mUnRegisterNumBadgeCallback;
24    private readonly mBadgeManager;
25    private mSubscriber: NotificationSubscriber = {
26        onConsume: this.onConsumeCallback.bind(this),
27        onCancel: this.onCancelCallback.bind(this),
28        onUpdate: this.onUpdateCallback.bind(this),
29        onConnect: this.onConnectCallback.bind(this),
30        onDisconnect: this.onDisconnectCallback.bind(this),
31        onDestroy: this.onDestroyCallback.bind(this)
32    }
33
34    private constructor() {
35        this.mRegisterNumBadgeCallback = this.registerNumBadgeCallback.bind(this);
36        this.mUnRegisterNumBadgeCallback = this.unRegisterNumBadgeCallback.bind(this);
37        this.mBadgeManager = BadgeManager.getInstance();
38    }
39
40    private onConsumeCallback(data) {
41        Log.showInfo(TAG, 'onConsumeCallback called !!');
42        this.handleSubscribeCallbackData(data, true);
43    }
44
45    private onCancelCallback(data) {
46        Log.showInfo(TAG, 'onCancelCallback called !!');
47        this.handleSubscribeCallbackData(data, false);
48    }
49
50    private onUpdateCallback() {
51        Log.showInfo(TAG, 'onUpdateCallback called !!');
52    }
53
54    private onConnectCallback() {
55        Log.showInfo(TAG, 'onConnectCallback called !!');
56    }
57
58    private onDisconnectCallback() {
59        Log.showInfo(TAG, 'onDisconnectCallback called !!');
60    }
61
62    private onDestroyCallback() {
63        Log.showInfo(TAG, 'onDestroyCallback called !!');
64    }
65
66    private async handleSubscribeCallbackData(data, needAdd: boolean) {
67        Log.showInfo(TAG, 'handleSubscribeCallbackData start !!');
68
69        let creatorUserId: number = data?.request?.creatorUserId;
70        let creatorBundleName: string = data?.request?.creatorBundleName;
71        let badgeNumber: number = data?.request?.badgeNumber;
72        Log.showDebug(TAG, `handleSubscribeCallbackData creatorUserId is ${creatorUserId} creatorBundleName is ${creatorBundleName} badgeNumber is ${badgeNumber}`);
73
74        let userId: number = AppModel.getInstance().getUserId();
75        if (userId != creatorUserId) {
76            Log.showError(TAG, `handleSubscribeCallbackData userid is diff  ${userId}`);
77            return;
78        }
79
80        let lastBadgeNumber = await this.mBadgeManager.getBadgeByBundleSync(creatorBundleName);
81        let newBadgeNumber: number = 0;
82        if (needAdd) {
83            newBadgeNumber = badgeNumber + lastBadgeNumber;
84        } else {
85            newBadgeNumber = lastBadgeNumber - badgeNumber;
86            if (newBadgeNumber < 0) {
87                newBadgeNumber = 0;
88            }
89        }
90        this.mBadgeManager.updateBadgeNumber(creatorBundleName, newBadgeNumber)
91            .then((result) => {
92                Log.showInfo(TAG, `updateBadgeByBundle result is ${result}`);
93            })
94            .catch(error => {
95                Log.showError(TAG, `updateBadgeByBundle error is ${error.message}`);
96            });
97
98    }
99
100    private insertBadgeItem() {
101
102    }
103
104    private registerNumBadgeCallback(err, data) {
105        if (err.code) {
106            Log.showInfo(TAG, 'registerNumBadgeCallback faided ' + JSON.stringify(err));
107        } else {
108            Log.showInfo(TAG, 'registerNumBadgeCallback success ');
109        }
110    }
111
112    private unRegisterNumBadgeCallback(err, data) {
113        if (err.code) {
114            Log.showInfo(TAG, 'unRegisterNumBadgeCallback faided ' + JSON.stringify(err));
115        } else {
116            Log.showInfo(TAG, 'unRegisterNumBadgeCallback success ');
117        }
118    }
119
120    static getInstance(): NumBadgeManager {
121        if (globalThis.sNumBadgeManager == null) {
122            globalThis.sNumBadgeManager = new NumBadgeManager();
123        }
124        return globalThis.sNumBadgeManager;
125    }
126
127    registerNumBadge() {
128        Log.showInfo(TAG, 'registerNumBadge called ');
129        Notification.subscribe(this.mSubscriber, this.mRegisterNumBadgeCallback);
130    }
131
132    unRegisterNumBadge() {
133        Log.showInfo(TAG, 'unRegisterNumBadge called ');
134        Notification.unsubscribe(this.mSubscriber, this.mUnRegisterNumBadgeCallback);
135    }
136}