1 /*
2  * Copyright (C) 2021-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  */
15 
16 #ifndef OHOS_WIFI_PROTECT_MANAGER_H
17 #define OHOS_WIFI_PROTECT_MANAGER_H
18 
19 #include <vector>
20 #include "wifi_protect.h"
21 #ifndef OHOS_ARCH_LITE
22 #include "appmgr/application_state_observer_stub.h"
23 #include "appmgr/app_state_data.h"
24 #include "ipc_skeleton.h"
25 #include "event_handler.h"
26 #include "event_runner.h"
27 #include "appmgr/app_mgr_interface.h"
28 #include "wifi_event_handler.h"
29 #endif
30 
31 namespace OHOS {
32 namespace Wifi {
33 #ifndef OHOS_ARCH_LITE
34 class AppStateObserver;
35 #endif
36 class WifiProtectManager {
37 public:
38     ~WifiProtectManager();
39     static WifiProtectManager &GetInstance();
40 
41     /**
42      * @Description Validate that the protect mode is valid
43      *
44      * @param protectMode - The protect mode to verify
45      * @return true - valid
46      * @return false - invalid
47      */
48     static bool IsValidProtectMode(const WifiProtectMode &protectMode);
49 
50     /**
51      * @Description Get the nearly protect type currently held by the WifiProtectManager
52      *
53      * @return WifiProtectMode - currently held protect
54      */
55     WifiProtectMode GetNearlyProtectMode();
56 
57     /**
58      * @Description Create a Wifi Protect.
59      *
60      * @param protectMode - representation of the Wifi Protect type
61      * @param protectName - represent the protect name
62      * @return true - create the protect success
63      * @return false - create protect failed
64      */
65     bool InitWifiProtect(const WifiProtectType &protectType, const std::string &protectName);
66 
67     /**
68      * @Description Allowing a calling app to acquire a Wifi Protect in the supplied mode
69      *
70      * @param protectMode - representation of the Wifi Protect type
71      * @param name - represent the protect
72      * @return true - acquired the protect success
73      * @return false - acquired protect failed
74      */
75     bool GetWifiProtect(const WifiProtectMode &protectMode, const std::string name);
76 
77     /**
78      * @Description Applications to release a WiFi Wake protect
79      *
80      * @param name - represent the protect
81      * @return true - put protect success
82      * @return false - put failed, the caller did not hold this protect
83      */
84     bool PutWifiProtect(const std::string &name);
85 
86     /**
87      * @Description Applications whether or not hold WiFi protect
88      *
89      * @param name - represent the protect
90      * @return true - app has held wifi protect
91      * @return false - app has not held wifi protect
92      */
93     bool IsHeldWifiProtect(const std::string &name);
94     /**
95      * @Description Set hi-perf mode protect state
96      *
97      * @param isEnabled - True to force hi-perf mode, false to leave it up to acquired wifiProtects
98      * @return true - success
99      * @return false - failed
100      */
101     bool ChangeToPerfMode(bool isEnabled);
102 
103     /**
104      * @Description Handler for screen state (on/off) changes
105      *
106      * @param screenOn - screen on/off state
107      */
108     void HandleScreenStateChanged(bool screenOn);
109 
110     /**
111      * @Description Handler for Wifi Client mode state changes
112      *
113      * @param isConnected - wifi client connect state
114      */
115     void UpdateWifiClientConnected(bool isConnected);
116 
117     /**
118      * @Description set low latency mode
119      *
120      * @param enabled - true: enable low latency, false: disable low latency
121      * @return bool - operation result
122      */
123     bool SetLowLatencyMode(bool enabled);
124     bool ChangeWifiPowerMode();
125 #ifndef OHOS_ARCH_LITE
126     void RegisterAppStateObserver();
127     void OnAppDied(const std::string bundlename);
128     void OnAppForegroudChanged(const std::string &bundleName, int state);
129 #endif
130 private:
131     WifiProtectManager();
132     bool AddProtect(const WifiProtectMode &protectMode, const std::string &name);
133     bool ReleaseProtect(const std::string &name);
134     std::shared_ptr<WifiProtect> RemoveProtect(const std::string &name);
135 #ifndef OHOS_ARCH_LITE
136     int GetFgLowlatyProtectCount();
137 #endif
138 private:
139     std::vector<std::shared_ptr<WifiProtect>> mWifiProtects;
140     WifiProtectMode mCurrentOpMode {WifiProtectMode::WIFI_PROTECT_NO_HELD};
141     int mFullHighPerfProtectsAcquired {0};
142     int mFullHighPerfProtectsReleased {0};
143     int mFullLowLatencyProtectsAcquired {0};
144     int mFullLowLatencyProtectsReleased {0};
145     /* Not used: long mCurrentSessionStartTimeMs; */
146     bool mWifiConnected {false};
147     bool mScreenOn {false};
148     bool mForceHiPerfMode {false};
149     bool mForceLowLatencyMode {false};
150     std::mutex mMutex;
151 #ifndef OHOS_ARCH_LITE
152     sptr<AppExecFwk::IAppMgr> mAppObject {nullptr};
153 #endif
154 };
155 } // namespace Wifi
156 } // namespace OHOS
157 
158 #endif
159