15ccb8f90Sopenharmony_ci/*
25ccb8f90Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
35ccb8f90Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
45ccb8f90Sopenharmony_ci * you may not use this file except in compliance with the License.
55ccb8f90Sopenharmony_ci * You may obtain a copy of the License at
65ccb8f90Sopenharmony_ci *
75ccb8f90Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
85ccb8f90Sopenharmony_ci *
95ccb8f90Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
105ccb8f90Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
115ccb8f90Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125ccb8f90Sopenharmony_ci * See the License for the specific language governing permissions and
135ccb8f90Sopenharmony_ci * limitations under the License.
145ccb8f90Sopenharmony_ci */
155ccb8f90Sopenharmony_ci
165ccb8f90Sopenharmony_ci#ifndef POWERMGR_WAKEUP_CONTROLLER_H
175ccb8f90Sopenharmony_ci#define POWERMGR_WAKEUP_CONTROLLER_H
185ccb8f90Sopenharmony_ci
195ccb8f90Sopenharmony_ci#include <functional>
205ccb8f90Sopenharmony_ci#include <memory>
215ccb8f90Sopenharmony_ci#include <mutex>
225ccb8f90Sopenharmony_ci#include <vector>
235ccb8f90Sopenharmony_ci
245ccb8f90Sopenharmony_ci#ifdef HAS_MULTIMODALINPUT_INPUT_PART
255ccb8f90Sopenharmony_ci#include "i_input_event_consumer.h"
265ccb8f90Sopenharmony_ci#endif
275ccb8f90Sopenharmony_ci#include "power_state_machine.h"
285ccb8f90Sopenharmony_ci#include "system_ability.h"
295ccb8f90Sopenharmony_ci#ifdef HAS_SENSORS_SENSOR_PART
305ccb8f90Sopenharmony_ci#include "sensor_agent.h"
315ccb8f90Sopenharmony_ci#endif
325ccb8f90Sopenharmony_ci#include "wakeup_sources.h"
335ccb8f90Sopenharmony_ci#include "wakeup_source_parser.h"
345ccb8f90Sopenharmony_ci
355ccb8f90Sopenharmony_cinamespace OHOS {
365ccb8f90Sopenharmony_cinamespace PowerMgr {
375ccb8f90Sopenharmony_ci
385ccb8f90Sopenharmony_ciusing WakeupListener = std::function<void(WakeupDeviceType)>;
395ccb8f90Sopenharmony_ciusing namespace OHOS::MMI;
405ccb8f90Sopenharmony_ciclass WakeupMonitor;
415ccb8f90Sopenharmony_ciclass WakeupController : public std::enable_shared_from_this<WakeupController> {
425ccb8f90Sopenharmony_cipublic:
435ccb8f90Sopenharmony_ci    explicit WakeupController(std::shared_ptr<PowerStateMachine>& stateMachine);
445ccb8f90Sopenharmony_ci    ~WakeupController();
455ccb8f90Sopenharmony_ci    void Init();
465ccb8f90Sopenharmony_ci    void Cancel();
475ccb8f90Sopenharmony_ci    void RegisterSettingsObserver();
485ccb8f90Sopenharmony_ci    void UnregisterSettingsObserver();
495ccb8f90Sopenharmony_ci    void ExecWakeupMonitorByReason(WakeupDeviceType reason);
505ccb8f90Sopenharmony_ci    void Wakeup();
515ccb8f90Sopenharmony_ci    void NotifyDisplayActionDone(uint32_t event);
525ccb8f90Sopenharmony_ci    void SetOriginSettingValue(WakeupSource& source);
535ccb8f90Sopenharmony_ci#ifdef POWER_MANAGER_WAKEUP_ACTION
545ccb8f90Sopenharmony_ci    bool IsLowCapacityWakeup(WakeupDeviceType reason);
555ccb8f90Sopenharmony_ci    void ProcessLowCapacityWakeup();
565ccb8f90Sopenharmony_ci#endif
575ccb8f90Sopenharmony_ci    static int32_t SetWakeupDoubleClickSensor(bool enable);
585ccb8f90Sopenharmony_ci    static void ChangeWakeupSourceConfig(bool updateEnable);
595ccb8f90Sopenharmony_ci    static void ChangePickupWakeupSourceConfig(bool updataEnable);
605ccb8f90Sopenharmony_ci    static void PickupConnectMotionConfig(bool databaseSwitchValue);
615ccb8f90Sopenharmony_ci    static void ChangeLidWakeupSourceConfig(bool updataEnable);
625ccb8f90Sopenharmony_ci    std::shared_ptr<PowerStateMachine> GetStateMachine()
635ccb8f90Sopenharmony_ci    {
645ccb8f90Sopenharmony_ci        return stateMachine_;
655ccb8f90Sopenharmony_ci    }
665ccb8f90Sopenharmony_ci    WakeupDeviceType GetLastReason() const
675ccb8f90Sopenharmony_ci    {
685ccb8f90Sopenharmony_ci        return wakeupReason_;
695ccb8f90Sopenharmony_ci    }
705ccb8f90Sopenharmony_ci    bool CheckEventReciveTime(WakeupDeviceType wakeupType);
715ccb8f90Sopenharmony_ci#ifdef POWER_MANAGER_ENABLE_EXTERNAL_SCREEN_MANAGEMENT
725ccb8f90Sopenharmony_ci    void PowerOnInternalScreen(WakeupDeviceType type);
735ccb8f90Sopenharmony_ci    void PowerOnAllScreens(WakeupDeviceType type);
745ccb8f90Sopenharmony_ci#endif
755ccb8f90Sopenharmony_ci
765ccb8f90Sopenharmony_ciprivate:
775ccb8f90Sopenharmony_ci    class SleepGuard final {
785ccb8f90Sopenharmony_ci    public:
795ccb8f90Sopenharmony_ci        explicit SleepGuard(const sptr<PowerMgrService>& pms);
805ccb8f90Sopenharmony_ci        ~SleepGuard();
815ccb8f90Sopenharmony_ci        SleepGuard(const SleepGuard&) = delete;
825ccb8f90Sopenharmony_ci        SleepGuard(SleepGuard&&) = delete;
835ccb8f90Sopenharmony_ci        SleepGuard& operator=(const SleepGuard&) = delete;
845ccb8f90Sopenharmony_ci        SleepGuard& operator=(SleepGuard&&) = delete;
855ccb8f90Sopenharmony_ci
865ccb8f90Sopenharmony_ci    private:
875ccb8f90Sopenharmony_ci        sptr<IRemoteObject> token_;
885ccb8f90Sopenharmony_ci        sptr<PowerMgrService> pms_;
895ccb8f90Sopenharmony_ci    };
905ccb8f90Sopenharmony_ci
915ccb8f90Sopenharmony_ci#ifdef POWER_MANAGER_ENABLE_EXTERNAL_SCREEN_MANAGEMENT
925ccb8f90Sopenharmony_ci    bool IsPowerOnInernalScreenOnlyScene(WakeupDeviceType reason) const;
935ccb8f90Sopenharmony_ci    void ProcessPowerOnInternalScreenOnly(const sptr<PowerMgrService>& pms, WakeupDeviceType reason);
945ccb8f90Sopenharmony_ci#endif
955ccb8f90Sopenharmony_ci    bool NeedToSkipCurrentWakeup(const sptr<PowerMgrService>& pms, WakeupDeviceType reason) const;
965ccb8f90Sopenharmony_ci    void HandleWakeup(const sptr<PowerMgrService>& pms, WakeupDeviceType reason);
975ccb8f90Sopenharmony_ci    void ControlListener(WakeupDeviceType reason);
985ccb8f90Sopenharmony_ci
995ccb8f90Sopenharmony_ci    std::vector<WakeupSource> sourceList_;
1005ccb8f90Sopenharmony_ci    std::map<WakeupDeviceType, std::shared_ptr<WakeupMonitor>> monitorMap_;
1015ccb8f90Sopenharmony_ci    std::map<WakeupDeviceType, int64_t> eventHandleMap_;
1025ccb8f90Sopenharmony_ci    std::shared_ptr<PowerStateMachine> stateMachine_;
1035ccb8f90Sopenharmony_ci    WakeupDeviceType wakeupReason_ {0};
1045ccb8f90Sopenharmony_ci    std::mutex mutex_;
1055ccb8f90Sopenharmony_ci    std::mutex monitorMutex_;
1065ccb8f90Sopenharmony_ci    std::mutex eventHandleMutex_;
1075ccb8f90Sopenharmony_ci    static std::mutex sourceUpdateMutex_;
1085ccb8f90Sopenharmony_ci    int32_t monitorId_ {-1};
1095ccb8f90Sopenharmony_ci};
1105ccb8f90Sopenharmony_ci
1115ccb8f90Sopenharmony_ci#ifdef HAS_MULTIMODALINPUT_INPUT_PART
1125ccb8f90Sopenharmony_ciclass InputCallback : public IInputEventConsumer {
1135ccb8f90Sopenharmony_cipublic:
1145ccb8f90Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<KeyEvent> keyEvent) const;
1155ccb8f90Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent) const;
1165ccb8f90Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<AxisEvent> axisEvent) const;
1175ccb8f90Sopenharmony_ci    bool NonWindowEvent(const std::shared_ptr<PointerEvent>& pointerEvent) const;
1185ccb8f90Sopenharmony_ciprivate:
1195ccb8f90Sopenharmony_ci    bool isRemoteEvent(std::shared_ptr<InputEvent> event) const;
1205ccb8f90Sopenharmony_ci    bool isKeyboardKeycode(int32_t keyCode) const;
1215ccb8f90Sopenharmony_ci};
1225ccb8f90Sopenharmony_ci#endif
1235ccb8f90Sopenharmony_ci
1245ccb8f90Sopenharmony_ciclass WakeupMonitor {
1255ccb8f90Sopenharmony_cipublic:
1265ccb8f90Sopenharmony_ci    static std::shared_ptr<WakeupMonitor> CreateMonitor(WakeupSource& source);
1275ccb8f90Sopenharmony_ci    static constexpr int32_t POWER_KEY_PRESS_DELAY_MS = 10000;
1285ccb8f90Sopenharmony_ci
1295ccb8f90Sopenharmony_ci    virtual ~WakeupMonitor() = default;
1305ccb8f90Sopenharmony_ci    virtual bool Init() = 0;
1315ccb8f90Sopenharmony_ci    virtual void Cancel() = 0;
1325ccb8f90Sopenharmony_ci    virtual void HandleEvent(uint32_t eventId)
1335ccb8f90Sopenharmony_ci    {
1345ccb8f90Sopenharmony_ci        // do nothing in base class
1355ccb8f90Sopenharmony_ci    }
1365ccb8f90Sopenharmony_ci
1375ccb8f90Sopenharmony_ci    WakeupDeviceType GetReason() const
1385ccb8f90Sopenharmony_ci    {
1395ccb8f90Sopenharmony_ci        return reason_;
1405ccb8f90Sopenharmony_ci    }
1415ccb8f90Sopenharmony_ci
1425ccb8f90Sopenharmony_ci    void RegisterListener(WakeupListener listener)
1435ccb8f90Sopenharmony_ci    {
1445ccb8f90Sopenharmony_ci        listener_ = listener;
1455ccb8f90Sopenharmony_ci    }
1465ccb8f90Sopenharmony_ci
1475ccb8f90Sopenharmony_ci    void Notify()
1485ccb8f90Sopenharmony_ci    {
1495ccb8f90Sopenharmony_ci        listener_(reason_);
1505ccb8f90Sopenharmony_ci    }
1515ccb8f90Sopenharmony_ci
1525ccb8f90Sopenharmony_ciprotected:
1535ccb8f90Sopenharmony_ci    explicit WakeupMonitor(WakeupSource& source)
1545ccb8f90Sopenharmony_ci    {
1555ccb8f90Sopenharmony_ci        reason_ = source.GetReason();
1565ccb8f90Sopenharmony_ci    }
1575ccb8f90Sopenharmony_ci
1585ccb8f90Sopenharmony_ci    WakeupDeviceType reason_;
1595ccb8f90Sopenharmony_ci    WakeupListener listener_;
1605ccb8f90Sopenharmony_ci};
1615ccb8f90Sopenharmony_ci
1625ccb8f90Sopenharmony_ciclass PowerkeyWakeupMonitor : public WakeupMonitor {
1635ccb8f90Sopenharmony_cipublic:
1645ccb8f90Sopenharmony_ci    explicit PowerkeyWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {}
1655ccb8f90Sopenharmony_ci    ~PowerkeyWakeupMonitor() override = default;
1665ccb8f90Sopenharmony_ci    bool Init() override;
1675ccb8f90Sopenharmony_ci    void Cancel() override;
1685ccb8f90Sopenharmony_ci
1695ccb8f90Sopenharmony_ciprivate:
1705ccb8f90Sopenharmony_ci    int32_t powerkeyShortPressId_ {-1};
1715ccb8f90Sopenharmony_ci};
1725ccb8f90Sopenharmony_ci
1735ccb8f90Sopenharmony_ciclass KeyboardWakeupMonitor : public WakeupMonitor {
1745ccb8f90Sopenharmony_cipublic:
1755ccb8f90Sopenharmony_ci    explicit KeyboardWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {}
1765ccb8f90Sopenharmony_ci    ~KeyboardWakeupMonitor() override = default;
1775ccb8f90Sopenharmony_ci    bool Init() override;
1785ccb8f90Sopenharmony_ci    void Cancel() override;
1795ccb8f90Sopenharmony_ci};
1805ccb8f90Sopenharmony_ci
1815ccb8f90Sopenharmony_ciclass MousekeyWakeupMonitor : public WakeupMonitor {
1825ccb8f90Sopenharmony_cipublic:
1835ccb8f90Sopenharmony_ci    explicit MousekeyWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {}
1845ccb8f90Sopenharmony_ci    ~MousekeyWakeupMonitor() override = default;
1855ccb8f90Sopenharmony_ci    bool Init() override;
1865ccb8f90Sopenharmony_ci    void Cancel() override;
1875ccb8f90Sopenharmony_ci};
1885ccb8f90Sopenharmony_ci
1895ccb8f90Sopenharmony_ciclass TouchpadWakeupMonitor : public WakeupMonitor {
1905ccb8f90Sopenharmony_cipublic:
1915ccb8f90Sopenharmony_ci    explicit TouchpadWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {}
1925ccb8f90Sopenharmony_ci    ~TouchpadWakeupMonitor() override = default;
1935ccb8f90Sopenharmony_ci    bool Init() override;
1945ccb8f90Sopenharmony_ci    void Cancel() override;
1955ccb8f90Sopenharmony_ci};
1965ccb8f90Sopenharmony_ci
1975ccb8f90Sopenharmony_ciclass PenWakeupMonitor : public WakeupMonitor {
1985ccb8f90Sopenharmony_cipublic:
1995ccb8f90Sopenharmony_ci    explicit PenWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {}
2005ccb8f90Sopenharmony_ci    ~PenWakeupMonitor() override = default;
2015ccb8f90Sopenharmony_ci    bool Init() override;
2025ccb8f90Sopenharmony_ci    void Cancel() override;
2035ccb8f90Sopenharmony_ci};
2045ccb8f90Sopenharmony_ci
2055ccb8f90Sopenharmony_ciclass SingleClickWakeupMonitor : public WakeupMonitor {
2065ccb8f90Sopenharmony_cipublic:
2075ccb8f90Sopenharmony_ci    explicit SingleClickWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {}
2085ccb8f90Sopenharmony_ci    ~SingleClickWakeupMonitor() override = default;
2095ccb8f90Sopenharmony_ci    bool Init() override;
2105ccb8f90Sopenharmony_ci    void Cancel() override;
2115ccb8f90Sopenharmony_ci};
2125ccb8f90Sopenharmony_ci
2135ccb8f90Sopenharmony_ciclass DoubleClickWakeupMonitor : public WakeupMonitor {
2145ccb8f90Sopenharmony_cipublic:
2155ccb8f90Sopenharmony_ci    explicit DoubleClickWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {}
2165ccb8f90Sopenharmony_ci    ~DoubleClickWakeupMonitor() override = default;
2175ccb8f90Sopenharmony_ci    bool Init() override;
2185ccb8f90Sopenharmony_ci    void Cancel() override;
2195ccb8f90Sopenharmony_ci};
2205ccb8f90Sopenharmony_ci
2215ccb8f90Sopenharmony_ciclass LidWakeupMonitor : public WakeupMonitor {
2225ccb8f90Sopenharmony_cipublic:
2235ccb8f90Sopenharmony_ci    explicit LidWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {}
2245ccb8f90Sopenharmony_ci    ~LidWakeupMonitor() override = default;
2255ccb8f90Sopenharmony_ci    bool Init() override;
2265ccb8f90Sopenharmony_ci    void Cancel() override;
2275ccb8f90Sopenharmony_ci};
2285ccb8f90Sopenharmony_ci
2295ccb8f90Sopenharmony_ciclass SwitchWakeupMonitor : public WakeupMonitor {
2305ccb8f90Sopenharmony_cipublic:
2315ccb8f90Sopenharmony_ci    explicit SwitchWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {}
2325ccb8f90Sopenharmony_ci    ~SwitchWakeupMonitor() override = default;
2335ccb8f90Sopenharmony_ci    bool Init() override;
2345ccb8f90Sopenharmony_ci    void Cancel() override;
2355ccb8f90Sopenharmony_ci};
2365ccb8f90Sopenharmony_ci
2375ccb8f90Sopenharmony_ciclass PickupWakeupMonitor : public WakeupMonitor {
2385ccb8f90Sopenharmony_cipublic:
2395ccb8f90Sopenharmony_ci    explicit PickupWakeupMonitor(WakeupSource& source) : WakeupMonitor(source) {}
2405ccb8f90Sopenharmony_ci    ~PickupWakeupMonitor() override = default;
2415ccb8f90Sopenharmony_ci    bool Init() override;
2425ccb8f90Sopenharmony_ci    void Cancel() override;
2435ccb8f90Sopenharmony_ci};
2445ccb8f90Sopenharmony_ci
2455ccb8f90Sopenharmony_ci} // namespace PowerMgr
2465ccb8f90Sopenharmony_ci} // namespace OHOS
2475ccb8f90Sopenharmony_ci
2485ccb8f90Sopenharmony_ci#endif