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 
41 private:
42     class AppStateObserver final : public AppExecFwk::ApplicationStateObserverStub {
43     public:
44         AppStateObserver(Channel<CooperateEvent>::Sender sender, int32_t clientPid);
45         ~AppStateObserver() = default;
46         void OnProcessDied(const AppExecFwk::ProcessData &processData) override;
47         void UpdateClientPid(int32_t clientPid);
48 
49     private:
50         Channel<CooperateEvent>::Sender sender_;
51         int32_t clientPid_;
52     };
53 
54 private:
55     void TransiteTo(Context &context, CooperateState state) override;
56     void AddHandler(CooperateEventType event, std::function<void(Context&, const CooperateEvent&)> handler);
57     void OnQuit(Context &context);
58     void AddObserver(Context &context, const CooperateEvent &event);
59     void RemoveObserver(Context &context, const CooperateEvent &event);
60     void RegisterListener(Context &context, const CooperateEvent &event);
61     void UnregisterListener(Context &context, const CooperateEvent &event);
62     void RegisterHotAreaListener(Context &context, const CooperateEvent &event);
63     void UnregisterHotAreaListener(Context &context, const CooperateEvent &event);
64     void EnableCooperate(Context &context, const CooperateEvent &event);
65     void DisableCooperate(Context &context, const CooperateEvent &event);
66     void StartCooperate(Context &context, const CooperateEvent &event);
67     void GetCooperateState(Context &context, const CooperateEvent &event);
68     void RegisterEventListener(Context &context, const CooperateEvent &event);
69     void UnregisterEventListener(Context &context, const CooperateEvent &event);
70     void OnBoardOnline(Context &context, const CooperateEvent &event);
71     void OnBoardOffline(Context &context, const CooperateEvent &event);
72     void OnProfileChanged(Context &context, const CooperateEvent &event);
73     void OnPointerEvent(Context &context, const CooperateEvent &event);
74     void OnSoftbusSubscribeMouseLocation(Context &context, const CooperateEvent &event);
75     void OnProcessClientDied(Context &context, const CooperateEvent &event);
76     void OnSoftbusUnSubscribeMouseLocation(Context &context, const CooperateEvent &event);
77     void OnSoftbusReplySubscribeMouseLocation(Context &context, const CooperateEvent &event);
78     void OnSoftbusReplyUnSubscribeMouseLocation(Context &context, const CooperateEvent &event);
79     void OnSoftbusMouseLocation(Context &context, const CooperateEvent &event);
80     void OnSoftbusSessionClosed(Context &context, const CooperateEvent &event);
81     void OnSoftbusSessionOpened(Context &context, const CooperateEvent &event);
82     void OnHotPlugEvent(Context &context, const CooperateEvent &event);
83     void OnRemoteStart(Context &context, const CooperateEvent &event);
84     void OnRemoteHotPlug(Context &context, const CooperateEvent &event);
85     void OnRemoteInputDevice(Context &context, const CooperateEvent &event);
86     void Transfer(Context &context, const CooperateEvent &event);
87     sptr<AppExecFwk::IAppMgr> GetAppMgr();
88     int32_t RegisterApplicationStateObserver(Channel<CooperateEvent>::Sender sender, const EnableCooperateEvent &event);
89     std::string GetPackageName(Security::AccessToken::AccessTokenID tokenId);
90     void UnregisterApplicationStateObserver();
91     void UpdateApplicationStateObserver(int32_t clientPid);
92     void AddSessionObserver(Context &context, const EnableCooperateEvent &event);
93     void RemoveSessionObserver(Context &context, const DisableCooperateEvent &event);
94     void OnCommonEvent(Context &context, const std::string &commonEvent);
95     void AddMonitor(Context &context);
96     void RemoveMonitor(Context &context);
97     void RemoveWatches(Context &context);
98 
99     IContext *env_ { nullptr };
100     std::map<CooperateEventType, std::function<void(Context&, const CooperateEvent&)>> handlers_;
101     size_t current_ { COOPERATE_STATE_FREE };
102     std::array<std::shared_ptr<ICooperateState>, N_COOPERATE_STATES> states_;
103     std::set<std::string> onlineBoards_;
104     int32_t monitorId_ { -1 };
105     std::vector<std::string> clientBundleNames_;
106     sptr<AppStateObserver> appStateObserver_ { nullptr };
107     std::shared_ptr<ICommonEventObserver> observer_ { nullptr };
108 };
109 } // namespace Cooperate
110 } // namespace DeviceStatus
111 } // namespace Msdp
112 } // namespace OHOS
113 #endif // COOPERATE_STATE_MACHINE_H
114