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