1e75ebbc8Sopenharmony_ci/*
2e75ebbc8Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3e75ebbc8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e75ebbc8Sopenharmony_ci * you may not use this file except in compliance with the License.
5e75ebbc8Sopenharmony_ci * You may obtain a copy of the License at
6e75ebbc8Sopenharmony_ci *
7e75ebbc8Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e75ebbc8Sopenharmony_ci *
9e75ebbc8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e75ebbc8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e75ebbc8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e75ebbc8Sopenharmony_ci * See the License for the specific language governing permissions and
13e75ebbc8Sopenharmony_ci * limitations under the License.
14e75ebbc8Sopenharmony_ci */
15e75ebbc8Sopenharmony_ci
16e75ebbc8Sopenharmony_ciimport commonEvent from "@ohos.commonEvent";
17e75ebbc8Sopenharmony_ciimport { CommonEventData } from "commonEvent/commonEventData";
18e75ebbc8Sopenharmony_ciimport EventManager from "../event/EventManager";
19e75ebbc8Sopenharmony_ciimport Log from "../Log";
20e75ebbc8Sopenharmony_ciimport { SCREEN_CHANGE_EVENT } from "../ScreenLockManager";
21e75ebbc8Sopenharmony_ci
22e75ebbc8Sopenharmony_ciexport type CommonEventManager = {
23e75ebbc8Sopenharmony_ci  subscriberCommonEvent: () => Promise<void>;
24e75ebbc8Sopenharmony_ci  unSubscriberCommonEvent: () => void;
25e75ebbc8Sopenharmony_ci  applyPolicy: (policys: Array<POLICY>) => void;
26e75ebbc8Sopenharmony_ci  release: () => void;
27e75ebbc8Sopenharmony_ci};
28e75ebbc8Sopenharmony_ci
29e75ebbc8Sopenharmony_ciexport enum POLICY {
30e75ebbc8Sopenharmony_ci  SCREEN_POLICY = "screenOnOffPolicy",
31e75ebbc8Sopenharmony_ci}
32e75ebbc8Sopenharmony_ci
33e75ebbc8Sopenharmony_citype ClearPolicy = () => void;
34e75ebbc8Sopenharmony_citype InnerManager = { subscriberCommonEvent: () => void; unSubscriberCommonEvent: () => void };
35e75ebbc8Sopenharmony_ciconst policyMap: { [key in POLICY]: (manager: InnerManager) => ClearPolicy } = {
36e75ebbc8Sopenharmony_ci  screenOnOffPolicy: ScreenPolicy,
37e75ebbc8Sopenharmony_ci};
38e75ebbc8Sopenharmony_ci
39e75ebbc8Sopenharmony_ciexport function getCommonEventManager(
40e75ebbc8Sopenharmony_ci  tag: string,
41e75ebbc8Sopenharmony_ci  subscribeInfos: { events: Array<string> },
42e75ebbc8Sopenharmony_ci  commonEventCallback: (data: CommonEventData) => void,
43e75ebbc8Sopenharmony_ci  subscribeStateChange?: (isSubscribe: boolean) => void
44e75ebbc8Sopenharmony_ci): CommonEventManager {
45e75ebbc8Sopenharmony_ci  const TAG = `CommonEvent_${tag}`;
46e75ebbc8Sopenharmony_ci  const SUBSCRIBE_INFOS = subscribeInfos;
47e75ebbc8Sopenharmony_ci  let unSubcribers: Array<() => void> = [];
48e75ebbc8Sopenharmony_ci  let policyClearCb: Map<POLICY, ClearPolicy> | undefined = undefined;
49e75ebbc8Sopenharmony_ci
50e75ebbc8Sopenharmony_ci  async function subscriberCommonEvent() {
51e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, "registerSubscriber start");
52e75ebbc8Sopenharmony_ci    let subscriber = await commonEvent.createSubscriber(SUBSCRIBE_INFOS);
53e75ebbc8Sopenharmony_ci    commonEvent.subscribe(subscriber, (err, data) => {
54e75ebbc8Sopenharmony_ci      if (err.code != 0) {
55e75ebbc8Sopenharmony_ci        Log.showError(TAG, `Can't handle common event, err: ${JSON.stringify(err)}`);
56e75ebbc8Sopenharmony_ci        return;
57e75ebbc8Sopenharmony_ci      }
58e75ebbc8Sopenharmony_ci      Log.showDebug(TAG, `handle common event: ${data.event}`);
59e75ebbc8Sopenharmony_ci      commonEventCallback(data);
60e75ebbc8Sopenharmony_ci    });
61e75ebbc8Sopenharmony_ci    unSubcribers.push(() => commonEvent.unsubscribe(subscriber));
62e75ebbc8Sopenharmony_ci    subscribeStateChange && subscribeStateChange(true);
63e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `registerSubscriber success, size: ${unSubcribers.length}`);
64e75ebbc8Sopenharmony_ci  }
65e75ebbc8Sopenharmony_ci
66e75ebbc8Sopenharmony_ci  function unSubscriberCommonEvent() {
67e75ebbc8Sopenharmony_ci    Log.showDebug(TAG, `UnSubcribers size: ${unSubcribers.length}`);
68e75ebbc8Sopenharmony_ci    unSubcribers.forEach((unsubscribe) => unsubscribe());
69e75ebbc8Sopenharmony_ci    unSubcribers.length = 0;
70e75ebbc8Sopenharmony_ci    subscribeStateChange && subscribeStateChange(false);
71e75ebbc8Sopenharmony_ci  }
72e75ebbc8Sopenharmony_ci
73e75ebbc8Sopenharmony_ci  function applyPolicy(policys: Array<POLICY>) {
74e75ebbc8Sopenharmony_ci    const innerManager = { subscriberCommonEvent, unSubscriberCommonEvent };
75e75ebbc8Sopenharmony_ci    policyClearCb = policyClearCb ?? new Map();
76e75ebbc8Sopenharmony_ci    policys.forEach((policy) => {
77e75ebbc8Sopenharmony_ci      if (policyClearCb) {
78e75ebbc8Sopenharmony_ci        !policyClearCb.has(policy) && policyClearCb.set(policy, policyMap[policy](innerManager));
79e75ebbc8Sopenharmony_ci        Log.showDebug(TAG, `apply policy: ${policy}`);
80e75ebbc8Sopenharmony_ci      }
81e75ebbc8Sopenharmony_ci    });
82e75ebbc8Sopenharmony_ci  }
83e75ebbc8Sopenharmony_ci
84e75ebbc8Sopenharmony_ci  function release() {
85e75ebbc8Sopenharmony_ci    policyClearCb?.forEach((cb) => cb());
86e75ebbc8Sopenharmony_ci    policyClearCb?.clear();
87e75ebbc8Sopenharmony_ci    unSubscriberCommonEvent();
88e75ebbc8Sopenharmony_ci  }
89e75ebbc8Sopenharmony_ci
90e75ebbc8Sopenharmony_ci  return { subscriberCommonEvent, unSubscriberCommonEvent, applyPolicy, release };
91e75ebbc8Sopenharmony_ci}
92e75ebbc8Sopenharmony_ci
93e75ebbc8Sopenharmony_cifunction ScreenPolicy(manager: InnerManager): ClearPolicy {
94e75ebbc8Sopenharmony_ci  return EventManager.subscribe(SCREEN_CHANGE_EVENT, (isScreenOn: boolean) => {
95e75ebbc8Sopenharmony_ci    isScreenOn ? manager.subscriberCommonEvent() : manager.unSubscriberCommonEvent();
96e75ebbc8Sopenharmony_ci  });
97e75ebbc8Sopenharmony_ci}
98