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 INCALL_DATA_STATE_MACHINE_H
17 #define INCALL_DATA_STATE_MACHINE_H
18 
19 #include <map>
20 #include <memory>
21 
22 #include "apn_manager.h"
23 #include "cellular_data_constant.h"
24 #include "inner_event.h"
25 #include "refbase.h"
26 #include "state_machine.h"
27 #include "tel_event_handler.h"
28 
29 namespace OHOS {
30 namespace Telephony {
31 class IncallDataStateMachine : public StateMachine, public std::enable_shared_from_this<IncallDataStateMachine> {
32 public:
IncallDataStateMachine(int32_t slotId,std::weak_ptr<TelEventHandler> && cellularDataHandler,sptr<ApnManager> & apnManager)33     IncallDataStateMachine(
34         int32_t slotId, std::weak_ptr<TelEventHandler> &&cellularDataHandler, sptr<ApnManager> &apnManager)
35         : StateMachine("IncallDataStateMachine"), cellularDataHandler_(std::move(cellularDataHandler)),
36           apnManager_(apnManager), slotId_(slotId)
37     {}
38     ~IncallDataStateMachine() = default;
39     sptr<State> GetCurrentState() const;
40     int32_t GetSlotId() const;
41     int32_t GetCallState() const;
42     bool HasAnyConnectedState() const;
43     void UpdateCallState(int32_t state);
44     void Init(int32_t callState);
45 
46 protected:
47     sptr<State> idleState_;
48     sptr<State> secondaryActiveState_;
49     sptr<State> activatingSecondaryState_;
50     sptr<State> activatedSecondaryState_;
51     sptr<State> deactivatingSecondaryState_;
52     sptr<State> currentState_;
53     std::weak_ptr<TelEventHandler> cellularDataHandler_;
54     sptr<ApnManager> apnManager_;
55 
56 private:
57     void SetCurrentState(const sptr<State> &&state);
58     bool IsIncallDataSwitchOn();
59     bool IsSecondaryCanActiveData();
60     bool CanActiveDataByRadioTech();
61 
62 private:
63     friend class IdleState;
64     friend class SecondaryActiveState;
65     friend class ActivatingSecondaryState;
66     friend class ActivatedSecondaryState;
67     friend class DeactivatingSecondaryState;
68     int32_t slotId_ = INVALID_SLOT_ID;
69     int32_t callState_ = static_cast<int32_t>(TelCallStatus::CALL_STATUS_IDLE);
70 };
71 
72 class IdleState : public State {
73 public:
IdleState(std::weak_ptr<IncallDataStateMachine> && incallData,std::string && name)74     IdleState(std::weak_ptr<IncallDataStateMachine> &&incallData, std::string &&name)
75         : State(std::move(name)), stateMachine_(std::move(incallData))
76     {}
77     virtual ~IdleState() = default;
78     virtual void StateBegin();
79     virtual void StateEnd();
80     virtual bool StateProcess(const AppExecFwk::InnerEvent::Pointer &event);
81 
82 private:
83     bool ProcessCallStarted(const AppExecFwk::InnerEvent::Pointer &event);
84     bool ProcessCallEnded(const AppExecFwk::InnerEvent::Pointer &event);
85     bool ProcessSettingsOn(const AppExecFwk::InnerEvent::Pointer &event);
86     bool ProcessDsdsChanged(const AppExecFwk::InnerEvent::Pointer &event);
87 
88 private:
89     using Fun = std::function<bool(const AppExecFwk::InnerEvent::Pointer &data)>;
90     std::map<uint32_t, Fun> eventIdFunMap_ {
91         { CellularDataEventCode::MSG_SM_INCALL_DATA_CALL_STARTED,
92             [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessCallStarted(data); } },
93         { CellularDataEventCode::MSG_SM_INCALL_DATA_CALL_ENDED,
94             [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessCallEnded(data); } },
95         { CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_ON,
96             [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessSettingsOn(data); } },
97         { CellularDataEventCode::MSG_SM_INCALL_DATA_DSDS_CHANGED,
98             [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessDsdsChanged(data); } },
99     };
100     std::weak_ptr<IncallDataStateMachine> stateMachine_;
101 };
102 
103 class SecondaryActiveState : public State {
104 public:
SecondaryActiveState(std::weak_ptr<IncallDataStateMachine> && incallData,std::string && name)105     SecondaryActiveState(std::weak_ptr<IncallDataStateMachine> &&incallData, std::string &&name)
106         : State(std::move(name)), stateMachine_(std::move(incallData))
107     {}
108     virtual ~SecondaryActiveState() = default;
109     virtual void StateBegin();
110     virtual void StateEnd();
111     virtual bool StateProcess(const AppExecFwk::InnerEvent::Pointer &event);
112 
113 private:
114     bool ProcessSettingsOn(const AppExecFwk::InnerEvent::Pointer &event);
115     bool ProcessCallEnded(const AppExecFwk::InnerEvent::Pointer &event);
116     bool ProcessSettingsOff(const AppExecFwk::InnerEvent::Pointer &event);
117     bool ProcessDsdsChanged(const AppExecFwk::InnerEvent::Pointer &event);
118 
119 private:
120     using Fun = std::function<bool(const AppExecFwk::InnerEvent::Pointer &data)>;
121     std::map<uint32_t, Fun> eventIdFunMap_ {
122         { CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_ON,
123             [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessSettingsOn(data); } },
124         { CellularDataEventCode::MSG_SM_INCALL_DATA_CALL_ENDED,
125             [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessCallEnded(data); } },
126         { CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_OFF,
127             [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessSettingsOff(data); } },
128         { CellularDataEventCode::MSG_SM_INCALL_DATA_DSDS_CHANGED,
129             [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessDsdsChanged(data); } },
130     };
131     std::weak_ptr<IncallDataStateMachine> stateMachine_;
132 };
133 
134 class ActivatingSecondaryState : public State {
135 public:
ActivatingSecondaryState(std::weak_ptr<IncallDataStateMachine> && incallData,std::string && name)136     ActivatingSecondaryState(std::weak_ptr<IncallDataStateMachine> &&incallData, std::string &&name)
137         : State(std::move(name)), stateMachine_(std::move(incallData))
138     {}
139     virtual ~ActivatingSecondaryState() = default;
140     virtual void StateBegin();
141     virtual void StateEnd();
142     virtual bool StateProcess(const AppExecFwk::InnerEvent::Pointer &event);
143 
144 private:
145     std::weak_ptr<IncallDataStateMachine> stateMachine_;
146 };
147 
148 class ActivatedSecondaryState : public State {
149 public:
ActivatedSecondaryState(std::weak_ptr<IncallDataStateMachine> && incallData,std::string && name)150     ActivatedSecondaryState(std::weak_ptr<IncallDataStateMachine> &&incallData, std::string &&name)
151         : State(std::move(name)), stateMachine_(std::move(incallData))
152     {}
153     virtual ~ActivatedSecondaryState() = default;
154     virtual void StateBegin();
155     virtual void StateEnd();
156     virtual bool StateProcess(const AppExecFwk::InnerEvent::Pointer &event);
157 
158 private:
159     std::weak_ptr<IncallDataStateMachine> stateMachine_;
160 };
161 
162 class DeactivatingSecondaryState : public State {
163 public:
DeactivatingSecondaryState(std::weak_ptr<IncallDataStateMachine> && incallData,std::string && name)164     DeactivatingSecondaryState(std::weak_ptr<IncallDataStateMachine> &&incallData, std::string &&name)
165         : State(std::move(name)), stateMachine_(std::move(incallData))
166     {}
167     virtual ~DeactivatingSecondaryState() = default;
168     virtual void StateBegin();
169     virtual void StateEnd();
170     virtual bool StateProcess(const AppExecFwk::InnerEvent::Pointer &event);
171 
172 private:
173     std::weak_ptr<IncallDataStateMachine> stateMachine_;
174 };
175 } // namespace Telephony
176 } // namespace OHOS
177 #endif // INCALL_DATA_STATE_MACHINE_H