1 /*
2  * Copyright (c) 2023 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 COOPERATE_STATE_MACHINE_H
17 #define COOPERATE_STATE_MACHINE_H
18 
19 #include "nocopyable.h"
20 
21 #include "accesstoken_kit.h"
22 #include "app_mgr_interface.h"
23 #include "application_state_observer_stub.h"
24 #include "iapplication_state_observer.h"
25 
26 #include "i_common_event_adapter.h"
27 #include "i_cooperate_state.h"
28 
29 namespace OHOS {
30 namespace Msdp {
31 namespace DeviceStatus {
32 namespace Cooperate {
33 class StateMachine final : public IStateMachine {
34 public:
35     StateMachine(IContext *env);
36     ~StateMachine() = default;
37     DISALLOW_COPY_AND_MOVE(StateMachine);
38 
39     void OnEvent(Context &context, const CooperateEvent &event);
40     bool IsCooperateEnable();
41 
42 private:
43     class AppStateObserver final : public AppExecFwk::ApplicationStateObserverStub {
44     public:
45         AppStateObserver(Channel<CooperateEvent>::Sender sender, int32_t clientPid);
46         ~AppStateObserver() = default;
47         void UpdateClientPid(int32_t clientPid);
48         void OnProcessDied(const AppExecFwk::ProcessData &processData) override;
49 
50     private:
51         Channel<CooperateEvent>::Sender sender_;
52         int32_t clientPid_;
53     };
54 
55 private:
56     void TransiteTo(Context &context, CooperateState state) override;
57     void AddHandler(CooperateEventType event, std::function<void(Context&, const CooperateEvent&)> handler);
58     void OnQuit(Context &context);
59     void AddObserver(Context &context, const CooperateEvent &event);
60     void RemoveObserver(Context &context, const CooperateEvent &event);
61     void RegisterListener(Context &context, const CooperateEvent &event);
62     void UnregisterListener(Context &context, const CooperateEvent &event);
63     void RegisterHotAreaListener(Context &context, const CooperateEvent &event);
64     void UnregisterHotAreaListener(Context &context, const CooperateEvent &event);
65     void EnableCooperate(Context &context, const CooperateEvent &event);
66     void DisableCooperate(Context &context, const CooperateEvent &event);
67     void StartCooperate(Context &context, const CooperateEvent &event);
68     void StopCooperate(Context &context, const CooperateEvent &event);
69     void GetCooperateState(Context &context, const CooperateEvent &event);
70     void RegisterEventListener(Context &context, const CooperateEvent &event);
71     void UnregisterEventListener(Context &context, const CooperateEvent &event);
72     void OnBoardOnline(Context &context, const CooperateEvent &event);
73     void OnBoardOffline(Context &context, const CooperateEvent &event);
74     void OnProfileChanged(Context &context, const CooperateEvent &event);
75     void OnPointerEvent(Context &context, const CooperateEvent &event);
76     void OnSoftbusSubscribeMouseLocation(Context &context, const CooperateEvent &event);
77     void OnProcessClientDied(Context &context, const CooperateEvent &event);
78     void OnSoftbusUnSubscribeMouseLocation(Context &context, const CooperateEvent &event);
79     void OnSoftbusReplySubscribeMouseLocation(Context &context, const CooperateEvent &event);
80     void OnSoftbusReplyUnSubscribeMouseLocation(Context &context, const CooperateEvent &event);
81     void OnSoftbusMouseLocation(Context &context, const CooperateEvent &event);
82     void OnSoftbusSessionClosed(Context &context, const CooperateEvent &event);
83     void OnSoftbusSessionOpened(Context &context, const CooperateEvent &event);
84     void OnHotPlugEvent(Context &context, const CooperateEvent &event);
85     void OnRemoteStart(Context &context, const CooperateEvent &event);
86     void OnRemoteHotPlug(Context &context, const CooperateEvent &event);
87     void OnRemoteInputDevice(Context &context, const CooperateEvent &event);
88     void Transfer(Context &context, const CooperateEvent &event);
89     sptr<AppExecFwk::IAppMgr> GetAppMgr();
90     int32_t RegisterApplicationStateObserver(Channel<CooperateEvent>::Sender sender, const EnableCooperateEvent &event);
91     std::string GetPackageName(Security::AccessToken::AccessTokenID tokenId);
92     void UnregisterApplicationStateObserver();
93     void UpdateApplicationStateObserver(int32_t clientPid);
94     void AddSessionObserver(Context &context, const EnableCooperateEvent &event);
95     void RemoveSessionObserver(Context &context, const DisableCooperateEvent &event);
96     void OnCommonEvent(Context &context, const std::string &commonEvent);
97     void AddMonitor(Context &context);
98     void RemoveMonitor(Context &context);
99     void RemoveWatches(Context &context);
100 
101     IContext *env_ { nullptr };
102     std::map<CooperateEventType, std::function<void(Context&, const CooperateEvent&)>> handlers_;
103     size_t current_ { COOPERATE_STATE_FREE };
104     std::array<std::shared_ptr<ICooperateState>, N_COOPERATE_STATES> states_;
105     std::set<std::string> onlineBoards_;
106     int32_t monitorId_ { -1 };
107     std::vector<std::string> clientBundleNames_;
108     sptr<AppStateObserver> appStateObserver_ { nullptr };
109     std::shared_ptr<ICommonEventObserver> observer_ { nullptr };
110     bool isCooperateEnable_ { false };
111 };
112 } // namespace Cooperate
113 } // namespace DeviceStatus
114 } // namespace Msdp
115 } // namespace OHOS
116 #endif // COOPERATE_STATE_MACHINE_H
117